Skip to content

Commit

Permalink
[13-2, 16, 19, 21, 22] Bring main up to date with develop (#24)
Browse files Browse the repository at this point in the history
* BLD:
- first test of a GitHub CI for testing

* FIX:
- fixed wrong pip install and python versions in CI ?

* FIX:
- fixed loading of test files that do not contain test but dependencies that cannot be loaded ?

* BUG:
- escaped imports of unaccessible dependencies for test-file generation in GitHub CI tests by making the `if __name__ == "__main__"` include these imports and function definitions

* TST:
- test whether Cython build can be removed from GitHub actions for testing ?

* TST:
- reverted removal of Cython for testing

* PKG:
- moved the full package back into an `src`-folder

BLD:
- updated `pyproject.toml` and `setup.py` to account for the movement to the `src`-folder
- removed dedicated Cython build from CI test pipeline

* BLD:
- changed CI pipeline target branches

* BLD:
- augmented CI checks with format, type, and lint checks

* BUG:
- fixed CI pipeline wrong folder include ?

BLD:
- added isort check

* BUG:
- fixed broken `isort` usage in CI?

* FIX:
- fixed missing `isort` dependency in CI?
- fixed wrong import sort order in Cython Hermite functions

* FIX:
- fixed missing `colorama` dependency for `isort` in CI ?

* FIX:
- type-ignored Cython import that was not properly resolved by `pyright` ?

* FIX:
- fixed missing import of Cython module for `pyright`  in CI ?

* FIX:
- again trying to resolve the wrong import error of Cython module by `pyright` in CI ?

* FIX:
- fixed wrong `pyright` Cython import error of Cython import in CI

* BLD:
- removed pushes to `develop` from the GitHub CI actions

* BLD:
- added missing comma to the name of the GitHub CI action

* [10 develop] Add coverage to CI pipeline (#11)

* DOC:
- added Python versions and `black` code style to `README`

* DOC:
- added `isort` badge to `README`

* TST:
- added `--no-jit`-flag to `pytest` to enable proper coverage of Numba functions

* tmp:
- first test of CI with coverage report ?

* BUG:
- fixed failure of `pytest-xdist` and `pytest-cov` in GitHub CI (works locally) ?

* BUG:
- fixed accidentally placed `\` for `./tests` in coverage CI action ?

* BUG:
- added codecov to CI pipeline ?

* TST:
- tried to readd `pytest-xdist` for coverage reports ?

* wip:
- reset example Jupyter notebook number 3

* MAINT:
- made `_get_num_workers` a function of the `_utils`-model

TST:
- increased coverage to 100% by testing `np.float32` x-values for the Hermite functions was well as super negative numbers of requested workers

* DOC:
- added setup, installation, and development instructions to `README`

* DOC:
- switched back from `README.rst` to `README.md`

BLD:
- made CI pipeline push actions apply to the main branch only

* [Pre-16] Add Makefile (#17)

* BLD:
- added initial version of Makefile and based GitHub CI on it ?

* BUG:
- fixed type in `pip install` in `Makefile` for GitHub CI

* BLD:
- added plain install to Makefile
- removed current branch from GitHub CI trigger on push

DOC:
- added Makefile instructions to `README`

* [13-2] Implement class interface to Hermite functions (#18)

* BLD:
- added `mypy` to CI pipeline

BUG:
- fixed type error that `mypy` uncovered for the `filename_parameters_mapping` for the Hermite function reference generation

* wip:
- test if CI can still pass ?

* wip:
- CI apparently still runs; removed check

* BLD:
- added `pycodestyle` as a part of the CI checks

BUG:
- fixed a line too long error revealed by `pycodestyle`

* DOC:
- added CI test status to `README` ?

* ENH:
- added functions that help for computing discrete/continuous Fourier transforms (`fourier_transform._fft_utils`)

TST:
- implemented a test suite for `fourier_transform._fft_utils`

* Issue 14 #14
DOC:
- updated equations with new definitions of $\alpha$
- updated `README` with new equations and added respective reference that these definitions are based on

* Issue 14 #14
MAINT:
- removed redundant Numba version of the legacy Hermite functions and `jit`-compiled the NumPy-version instead
- fixed minor documentation issues

* Issue 14 #14
MAINT:
- adapted interface to Hermite functions to the new definition of $\alpha$ in terms of both implementation and docs

* Issue 14 #14
DOC:
- updated example scripts and resulting plots with new definition of $\alpha$

* Issue 14 #14
TST:
- generated new references files for testing the new definition of $\alpha$ for the Hermite functions
- adapted Hermite function tests to properly run for the new definition of $\alpha$
- configured Hermite function tests via global constants and kept comments in them more vague
- made test for Cramér's inequality of the Hermite functions ensure that the boundary value is not only an upper bound but actually reached
- changed `requirements` for GitHub CI because with a re-arrangement of the `if __name__ == "__main__"` in the Hermite function reference generation file, `sympy` and `tqdm` became CI requirements as well

* BUG:
- fixed failing `ruff` for too long line in docstring of new `_fft_utils`

BLD:
- temporarily enabled CI on push to current branch to check if it still passes after an adaption in `pyright`

* Issue 14 #14
BLD:
- disabled GitHub CI on push to the current branch again after verifying that it still runs

* Issue 13 #13 (3)
ENH:
- added `x_center` to the Hermite function basis for shifting the Hermite functions in x-direction
- added input validation for `x_center`

MAINT:
- renamed `hermite_functions._interface` to `hermite_functions._func_interface` to prepare for the class interface
- made type handling of Hermite function input validation smarter and safer by first converting to the target type and then testing only for this one
- made argument types for `x` of the Hermite functions broader by also including lists and tuples

TST:
- made input validation tests for Hermite functions be executed before the Hermite function reference tests
- made input validation tests for Hermite functions not only check failure but also success cases
- added tests for the new `x_center` and ensured that it does not modify the original `x`-values for the Hermite functions (after this causes some problems)

DOC:
- updated all equations and the `README` to clarify the new `x_center` for the Hermite functions
- updated installation commands (also mentioned venv activation) and test/check commands in `README`

* DOC:
- added y-axis to Hermite-function-scale-effect-plot
- fixed first vertical x-axis for order `n=0` not showing in the plot at all

* Issue #13 (3)
MAINT:
- moved Hermite function input validation to dedicated file

ENH:
- pushed forgotten files that add `x_center` to Hermite functions

TST:
- pushed forgotten files that test the new `x_center` of the Hermite functions and improved the testing of the Hermite function input validation

* TST:
- split up tests for Hermite functions into dedicated test files to be more flexible

* Issue #13 (3)
DOC:
- added common matplotlib style to unify all plots
- updated example scripts with new matplotlib style
- added shifted center to Hermite function example 01

* DOC:
- made example plots 01 and 02 for Hermite functions more visually appealing/less overwhelming

* Issue #13 (6.1)
ENH:
- added auxiliary script that auto-generates a Python file with spline coefficients for almost exactly evaluating the largest zero (= outermost roots) of the Hermite functions up to order ~100_000

* Issue #13 (6.1)
MAINT:
- refactored the reference creation for the largest roots of the Hermite functions to not minimize the relative but the absolute error
- relaxed permitted absolute error in reference creation for the largest roots of the Hermite functions because the SciPy-reference is not that accurate

DOC:
- mentioned that the SciPy-reference for the largest roots of the Hermite functions is not perfectly accurate

* Issue #13 (6)
ENH:
- added script to create reference data for the largest extrema of the Hermite functions
- added new `_approximations`-module for Hermite functions that offers approximations for their largest roots, largest extrema, and fadeout points

TST:
- added tests for the new `_approximations`-module

DOC:
- added legend to first plot in script that creates reference data for the largest roots of the Hermite functions

* MAINT:
- refactored the reference data generation for the largest roots and extrema of the Hermite functions to fit the splines based on relative errors
- updated reference data and plots created by these scripts
- made this reference data generation a developer-only script

TST:
- made test for largest root of Hermite functions more meaningful by adapting the tolerance for checking to the actual magnitude of the root position
- made test for largest extremum of Hermite functions more meaningful by checking the y-values (and not the x-values) of the extremum against a numerical optimisation (also with magnitude-adaptive tolerances)

* DOC:
- made all plot saves in examples available for developers only
- aligned plots in terms of visuals (especially titles and sizes)
- updated `README` with new plots and developer-only environment variable

* BLD:
- added additional scripts checks to GitHub CI
- made all tools cause actual failures rather than just printing test output ?
- broke CI on purpose, by badly formatting `auxiliary_scripts\02_hermite_functions_largest_extremum.py` and `src\robust_hermite_ft\hermite_functions\_c_hermite.pyx`

* BLD:
- CI tests fixed `black` formatting after confirming that it works
- `isort` is the next to check

* BLD:
- fixed `isort` CI failure after confirming that it works
- `pyright` is the next to check

* BLD:
- temporarily broke `isort` CI check again to check its output

* BLD:
- fixed `isort` problem again
- checking for reasons why `pyright`-check fails by running it separately without output ?

* BLD:
- fixed `pyright` error handling in CI
- `mypy` is the next one to check, but for now it's checked whether it just runs through even though there is an error

* BLD:
- pushing updated CI workflow file for properly testing that `mypy` just runs through
- added `matplotlib` to CI requirements to avoid `pyright` from throwing an error ?

* BLD:
- going back to the start for tests after `mypy` also stopped CI correctly
- starting with `black` test

* BLD:
- `black` successfully stopped the CI without customised handling
- `isort` is the next to check without customised handling

* BLD:
- also `isort` stops the CI on failure
- next to check is `pyright`

* BLD:
- reverted GitHub CI to its original working state

* DOC:
- updated `README` with new CI commands

* ENH:
- Hermite functions now support all kinds of real numeric scalars/Arrays as `x`-values, integer scalars as `n`-values, and real numeric scalars for `alpha` and `x_center` after making the input validation way more relaxed and smarter

TST:
- test for Hermite function input validation now covers Python and Numpy scalars individually and on top of that also includes Pandas series and Python Arrays
- test for data link to original `x` in Hermite functions now evaluates dynamically whether memory is shared by checking if changes in the copy/view are reflected in the original
- added a completely new test set whether the Hermite functions yield the same results for all different kinds of `x`-values, `n`-values, `alpha`- and `x-center` values

* BUG:
- fixed missing `pandas` dependency for GitHub CI

* BUG:
- fixed type incompatibility that caused `mypy` to crash the GitHub CI

* TST:
- fixed missing coverage for default and error handling of FFT utility functions

* DOC:
- arranged legend of plot for special points of Hermite functions in a better position

* TST:
- removed unnecessary list parametrization for orthonormality test of Hermite functions

* DEV:
- fixed wrong wording of static type check in Makefile
- added combined check for all checks to Makefile

* ENH:
- improved typing to given `dtype` type hint for Arrays in Hermite functions

* ENH:
- added check that the `x` for Hermite function computations holds at least 1 entry

TST:
- extended input validation test for Hermite functions to cover the "at least 1 element in x" failure case

* ENH:
- made integer type hinting of Hermite functions more consistent
- added option to disable input validation of Hermite functions

* DOC:
- added complete check make command to `README`

* Issue #13 (7, 8)
ENH:
- made `x_center` a float-only in the internals of the Hermite functions

TST:
- moved tests for function interface of the Hermite functions to a dedicated test file that can be distinguished from the tests for the class interface

DEV:
- added make command for running a single test

* DEV:
- made names of test commands in Makefile more descriptive in terms of coverage
- updated GitHub CI and `README` accordingly

* ENH:
- finalised proper type handling of the parameters of the Hermite functions in `_func_interface` and `_approximations`
- removed checks for `x_center is None`  for the Hermite function that are now obsolete given that it's always a float

* Issue #13 (7, 9)
ENH:
- implemented a class interface to the Hermite functions that can compute them in the time/space and frequency domain with in principle arbitrary parameters

Issue #13 (8)
TST:
- added extensive tests for the new class interface to the Hermite functions

* Issue #13 (7, 9)
ENH:
- added static method `eval` to `HermiteFunctionBasis` and made this the central computation method where `HermiteFunctionsBasis` (especially `__call__`) wraps around

Issue #13 (8)
TST:
- made tests for `HermiteFunctionBasis` properly cover both the static method `eval` and the magic method `__call__` via the parametrised tests

* [19] Rechange definition of `alpha` in Hermite functions back to a denominator; made Hermite function definition only real for the time/space domain (#20)

* # Issue 19
MAINT:
- refactored all Hermite functions computations (except for the class interface) to handle the new old definition of the scaling parameter alpha for `x / alpha` rather than the former `alpha * x`

TST:
- regenerated symbolic reference files for Hermite functions to reflect the new definition of alpha
- reflected new definition of alpha in all Hermite function tests
- improved test variable naming of global constants
- made x-value computation of the orthonormality test of the Hermite functions based on an approximation of the fadeout points and the order to lower the computational load while ensuring that the x-values are always properly created in a dynamic fashion
- made Cramér's inequality check for Hermite functions checked with relative rather than absolute tolerance

* Issue #19
DEV:
- added auxiliary script that creates images of the equations used for documenting the package
- added a make command to update all the equation images via this script

DOC:
- incorporated the new definition of the scaling factor alpha of the Hermite functions (not `alpha * x` but now `alpha / x` again) in the documentation
- cleaned up documentation equation images and plots
- linked all new equations and plots properly in the `README` and docstrings

* BUG:
- updated fontsize of equations to ensure they are properly rendered in `README` (not pixely) ?

* BUG:
- made equation images in `README` not pixely ?

* BUG:
- made equation images in `README` not pixely (new resolution) ?

* BUG:
- made equation images in `README` not pixely pt.3 ?

* BUG:
- made equation images in `README` not pixely pt.4 ?

* BUG:
- made equation images in `README` not pixely pt.5 (transition to SVG) ?

* BUG:
- made equation images in `README` not pixely pt.5 (SVG with reduced fontsize) ?

* BUG:
- made equation images in `README` not pixely pt.6 (SVG with even more fontsize reduction) ?

* BUG:
- made equation images in `README` not pixely pt.7 (SVG with even more fontsize reduction) ?

* DOC:
- fully transitioned to `.svg` instead of `.png` based documentation
- added plain definition of Hermite functions and polynomials to script that creates/updates equation images

* BUG:
- fixed too small equations in `README` ?

* BUG:
- fixed too small font of equation images in `README`

* Issue #19
MAINT:
- adapted definition of the Hermite function class interface to make the time/space domain real-valued only

TST:
- adapted output dtypes of the Hermite class interface to the new definition that the time/space domain has to be real-valued only

DOC:
- added LaTeX equation images for the Hermite functions and their Fourier transforms

* Issue #19
DOC:
- added example for the Fourier transforms of the Hermite functions with the new definition of `alpha`
- made the Fourier transform of the Hermite functions part of the `README`
- updated all plots because an axis label size changed

* BUG:
- fixed typo in `README`

* ENH:
- made validation functions for Hermite function input public
- made validation input for `x_center` for Hermite functions more generic

* ENH:
- made typing of input validation of Hermite functions indicate `Any` instead of any specified types

* DOC:
- changed colors of example 4 plots

* DOC:
- removed Fourier transform of Hermite functions from examples and `README`

* ENH:
- made input validation of Hermite functions more flexible for the `x_center` by just handling it as an offset of a certain axis

* Issue #13 (7 - 9)
ENH:
- actually a downwards enhancement
- removed the direct Fourier transform of the Hermite function class interface
- adapted all implementations, documentations, and tests to this new stripped down version of the class interface
- included class interface into function interface test for the Hermite functions and therefore renamed the test file from `function_interface` to `implementations`

* [21, 22] Remaned package to `robust_fourier`; dropped Cython implementation of Hermite functions (#23)

* Issue #22
MAINT:
- dropped Cython implementation of Hermite functions (also `cython-lint` as a check in the CI)

* Issue #22
MAINT:
- removed `Cython` and `psutil` from the requirements

* Issue #22
MAINT:
- completely dropped Cython implementation of all Hermite functions in the whole package

Issue #23
MAINT:
- renamed package from `robust_hermite_ft` to `robust_fourier`

* BUG:
- raised coverage to 100% again by conducting type error check for the `jit` property of the Hermite function class interface

* BUG:
- fix `black` check crashing the CI because of missing empty line

* Issue #22
MAINT:
- relaxed upper bound on NumPy version (now also v2 will be allowed)

* BUG:
- fixed wrong hashtag in test file

* BUG:
- fixed NumPy v2 deprecated `trapz`

* BUG:
- fixed wrong `README`-file in `pyproject.toml`
  • Loading branch information
MothNik authored Aug 8, 2024
1 parent 3c663ba commit f4ba9dd
Show file tree
Hide file tree
Showing 79 changed files with 34,845 additions and 939 deletions.
26 changes: 12 additions & 14 deletions .github/workflows/python-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,42 +23,40 @@ jobs:
with:
python-version: ${{ matrix.python-version }}

- name: Install Make
run: sudo apt-get install make

- name: Install dependencies and Build package
run: |
python -m pip install --upgrade pip setuptools wheel
pip install .["git_ci"]
make install-ci
- name: Run format check
run: |
black --check --diff --color ./auxiliary_scripts ./examples ./src ./tests
make black-check
- name: Run import sort check
run: |
isort --check --diff --color ./auxiliary_scripts ./examples ./src ./tests
make isort-check
- name: Run pyright static type check
run: |
pyright ./auxiliary_scripts ./examples ./src ./tests
make pyright-check
- name: Run mypy static type check
run: |
mypy ./auxiliary_scripts ./examples ./src ./tests
- name: Run ruff lint check
run: |
ruff check ./auxiliary_scripts ./examples ./src ./tests
make mypy-check
- name: Run pycodestyle check
run: |
pycodestyle ./auxiliary_scripts ./examples ./src ./tests --max-line-length=88 --ignore=E203,W503
make pycodestyle-check
- name: Run Cython check
- name: Run ruff lint check
run: |
cython-lint src/robust_hermite_ft/hermite_functions/_c_hermite.pyx
make ruff-check
- name: Run tests
run: |
pytest --cov=robust_hermite_ft ./tests -n="auto" --cov-report=xml -x --no-jit
make test-xmlcov
- name: Upload coverage report
uses: codecov/[email protected]
Expand Down
98 changes: 98 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# === Constants ===

# the source directories which are being checked
SRC_DIRS = ./auxiliary_scripts ./examples ./src ./tests

# === Package and Dependencies ===

# Upgrading pip, setuptools and wheel
.PHONY: upgrade-pip
upgrade-pip:
@echo Upgrading pip, setuptools and wheel ...
python -m pip install --upgrade pip setuptools wheel

# Installing the required dependencies and building the package
.PHONY: install
install: upgrade-pip
@echo Installing the required dependencies and building the package ...
python -m pip install --upgrade .

.PHONY: install-dev
install-dev: upgrade-pip
@echo Installing the required dependencies and building the package for development ...
python -m pip install --upgrade .["dev"]

.PHONY: install-ci
install-ci: upgrade-pip
@echo Installing the required dependencies for CI ...
python -m pip install --upgrade .["git_ci"]

# === Source File Checks ===

# black format checking
.PHONY: black-check
black-check:
@echo Checking code formatting with 'black' ...
black --check --diff --color $(SRC_DIRS)

# isort import checking
.PHONY: isort-check
isort-check:
@echo Checking import sorting with 'isort' ...
isort --check --diff --color $(SRC_DIRS)

# pyright static type checking
.PHONY: pyright-check
pyright-check:
@echo Checking types statically with 'pyright' ...
pyright $(SRC_DIRS)

# mypy static type checking
.PHONY: mypy-check
mypy-check:
@echo Checking types statically with 'mypy' ...
mypy $(SRC_DIRS)

# pycodestyle style checking
.PHONY: pycodestyle-check
pycodestyle-check:
@echo Checking code style with 'pycodestyle' ...
pycodestyle $(SRC_DIRS) --max-line-length=88 --ignore=E203,W503

# ruff lint checking
.PHONY: ruff-check
ruff-check:
@echo Checking code style with 'ruff' ...
ruff check $(SRC_DIRS)

# All checks combined
.PHONY: check
check: black-check isort-check pyright-check mypy-check pycodestyle-check ruff-check

# === Test Commands ===

# Running a single test
.PHONY: test
test:
@echo Running specific test with pytest ...
pytest -k "$(TEST)" -x

# Running the tests
.PHONY: test-htmlcov
test-htmlcov:
@echo Running the tests with HTML coverage report ...
pytest --cov=robust_fourier ./tests -n="auto" --cov-report=html -x --no-jit

.PHONY: test-xmlcov
test-xmlcov:
@echo Running the tests with XML coverage report ...
pytest --cov=robust_fourier ./tests -n="auto" --cov-report=xml -x --no-jit


# === Documentation ===

# Updating the LaTeX equations
.PHONY: update-equations
update-equations:
@echo Updating the LaTeX equations ...
python ./auxiliary_scripts/03_write_docs_equations.py
114 changes: 79 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# `robust_hermite_ft`
# `robust_fourier`

[![python-3.9](https://img.shields.io/badge/python-3.9-blue.svg)](https://www.python.org/downloads/release/python-390/)
[![python-3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)
Expand All @@ -7,8 +7,8 @@
[![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![code style: isort](https://img.shields.io/badge/code%20style-isort-000000.svg)](https://pycqa.github.io/isort/)
[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
[![codecov](https://codecov.io/gh/MothNik/robust_hermite_ft/branch/10-improve-and-add-coverage-to-CI/graph/badge.svg)](https://codecov.io/gh/MothNik/robust_hermite_ft/branch/10-improve-and-add-coverage-to-CI)
![tests](https://github.com/MothNik/robust_hermite_ft/actions/workflows/python-package.yml/badge.svg)
[![codecov](https://codecov.io/gh/MothNik/robust_fourier/branch/10-improve-and-add-coverage-to-CI/graph/badge.svg)](https://codecov.io/gh/MothNik/robust_fourier/branch/10-improve-and-add-coverage-to-CI)
![tests](https://github.com/MothNik/robust_fourier/actions/workflows/python-package.yml/badge.svg)
<br><br>

You want to compute the Fourier transform of a signal, but your signal can be corrupted by outliers? If so, this package is for you even though you will have to say goodbye to the _"fast"_ in _Fast Fourier Transform_ 🏃🙅‍♀️
Expand All @@ -24,60 +24,76 @@ Currently under construction. Please check back later.
Currently, the package is not yet available on PyPI. To install it, you can clone the repository

```bash
git clone https://github.com/MothNik/robust_hermite_ft.git
git clone https://github.com/MothNik/robust_fourier.git
```

and from within the repositories root directory, install it for normal use
For the following commands, a Makefile is provided to simplify the process. Its use is
optional, but recommended.<br>
From within the repositories root directory, the package can be installed for normal use

```bash
# activate your virtual environment, e.g., source venv/bin/activate
pip install .
make install
# equivalent to
pip install --upgrade .
```

or for development with all the development dependencies
or for development (with all the development dependencies)

```bash
# activate your virtual environment, e.g., source venv/bin/activate
pip install .["dev"]
make install-dev
# equivalent to
pip install --upgrade .["dev"]
```

⚠️ **Warning**: This will require a C-compiler to be installed on your system to
compile the Cython code.

When working in developer mode, an environment variable has to be added to run certain
scripts.

```
ROBHERMFT_DEVELOPER = true
ROBFT_DEVELOPER = true
```

### 🔎 Code quality

The following checks for `black`, `isort`, `pyright`, `ruff`, and
`cython-lint` - that are also part of the CI pipeline - can be run with
The following checks for `black`, `isort`, `pyright`, `mypy`, `pycodestyle`, and
`ruff` - that are also part of the CI pipeline - can be run with

```bash
make black-check
make isort-check
make pyright-check
make mypy-check
make pycodestyle-check
make ruff-check

# or for all at once
make check

# equivalent to
black --check --diff --color ./auxiliary_scripts ./examples ./src ./tests
isort --check --diff --color ./auxiliary_scripts ./examples ./src ./tests
pyright ./auxiliary_scripts ./examples ./src ./tests
mypy ./auxiliary_scripts ./examples ./src ./tests
ruff check ./auxiliary_scripts ./examples ./src ./tests
pycodestyle ./auxiliary_scripts ./examples ./src ./tests --max-line-length=88 --ignore=E203,W503
cython-lint src/robust_hermite_ft/hermite_functions/_c_hermite.pyx
```

### ✅❌ Tests

To run the tests - almost like in the CI pipeline - you can use

```bash
pytest --cov=robust_hermite_ft ./tests -n="auto" --cov-report=xml -x --no-jit
# or for a nice HTML coverage report
# pytest --cov=robust_hermite_ft ./tests -n="auto" --cov-report=html -x --no-jit
make test-xmlcov # for an XML report
make test-htmlcov # for an HTML report

# equivalent to
pytest --cov=robust_fourier ./tests -n="auto" --cov-report=xml -x --no-jit
pytest --cov=robust_fourier ./tests -n="auto" --cov-report=html -x --no-jit
```

for parallelized testing whose coverage report will be stored in the folder
`./htmlcov`.
for parallelized testing whose coverage report will be stored in the file
`./coverage.xml` or in the folder `./htmlcov`, respectively.

## 〰️ Hermite functions

Expand All @@ -90,20 +106,20 @@ functions or arbitrary order $n$ and argument - that can be scaled with a factor
$\alpha$ and shifted by a constant $\mu$:

<p align="center">
<img src="docs/hermite_functions/01-DilatedHermiteFunctions_DifferentScales.png" width="1000px" />
<img src="docs/hermite_functions/EX-01-DilatedHermiteFunctions_DifferentScales.svg" width="1000px" />
</p>

After a slight modification of the definitions in [[1]](#references), the Hermite
functions can be written as

<p align="left">
<img src="docs/hermite_functions/equations/Dilated_Hermite_Functions_Of_Generic_X.png" width="500px", height="91px" />
<p align="center">
<img src="docs/hermite_functions/equations/HF-01-Hermite_Functions_TimeSpace_Domain.svg" />
</p>

with the Hermite polynomials

<p align="left">
<img src="docs/hermite_functions/equations/Dilated_Hermite_Polynomials_Of_Generic_X.png" width="764px", height="65px" />
<p align="center">
<img src="docs/hermite_functions/equations/HF-02-Hermite_Polynomials_TimeSpace_Domain.svg" />
</p>

By making use of logarithm tricks, the evaluation that might involve infinitely high
Expand All @@ -113,14 +129,14 @@ results.

For doing so, the relation between the dilated and the non-dilated Hermite functions

<p align="left">
<img src="docs/hermite_functions/equations/HermiteFunctions_UndilatedToDilated.png" width="366px", height="32px" />
<p align="center">
<img src="docs/hermite_functions/equations/HF-03-Hermite_Functions_Dilated_to_Undilated.svg" />
</p>

and the recurrence relation for the Hermite functions

<p align="left">
<img src="docs/hermite_functions/equations/HermiteFunctions_RecurrenceRelation.png" width="576px", height="68px" />
<p align="center">
<img src="docs/hermite_functions/equations/HF-04-Hermite_Functions_Recurrence_Relation.svg" />
</p>

are used, but not directly. Instead, the latest evaluated Hermite function is kept at a
Expand All @@ -135,25 +151,53 @@ evaluated for this anymore. The factorial for example would already have overflo
orders of 170 in `float64`-precision.

<p align="center">
<img src="docs/hermite_functions/02-DilatedHermiteFunctions_Stability.png" width="1000px" />
<img src="docs/hermite_functions/EX-02-DilatedHermiteFunctions_Stability.svg" width="1000px" />
</p>

As a sanity check, their orthogonality is part of the tests together with a test for
the fact that the absolute values of the Hermite functions for real input cannot exceed
the value $\frac{\sqrt{\alpha}}{\pi^{-\frac{1}{4}}}$.
the value $\frac{1}{\sqrt[4]{\pi\cdot\alpha^{2}}}$.

On top of that `robust_hermite_ft` comes with utility functions to approximate some
On top of that `robust_fourier` comes with utility functions to approximate some
special points of the Hermite functions, namely the x-positions of their

- largest root (= outermost zero),
- largest maximum in the outermost oscillation, and
- largest extrema in the outermost oscillation, and
- the point where they numerically fade to zero.

```python
from robust_fourier import (
approximate_hermite_funcs_fadeout_x,
approximate_hermite_funcs_largest_extrema_x,
approximate_hermite_funcs_largest_zeros_x,
)

# 1) the x-positions at which the outermost oscillation fades below machine
# precision
x_fadeout = approximate_hermite_funcs_fadeout_x(
n=25,
alpha=20.0,
x_center=150.0,
)
# 2) the x-positions of the largest zeros
x_largest_zero = approximate_hermite_funcs_largest_zeros_x(
n=25,
alpha=20.0,
x_center=150.0,
)
# 3) the x-positions of the largest extrema
x_largest_extremum = approximate_hermite_funcs_largest_extrema_x(
n=25,
alpha=20.0,
x_center=150.0,
)
```

<p align="center">
<img src="docs/hermite_functions/04-HermiteFunctions_SpecialPoints.png" width="1000px" />
<img src="docs/hermite_functions/EX-04-HermiteFunctions_SpecialPoints.svg" width="1000px" />
</p>

## References
## 📖 References

- [1] Dobróka M., Szegedi H., and Vass P., Inversion-Based Fourier Transform as a New
Tool for Noise Rejection, _Fourier Transforms - High-tech Application and Current Trends_
Expand Down
Loading

0 comments on commit f4ba9dd

Please sign in to comment.