feat!: big breaking change set
All checks were successful
gitea-physics/pynam/pipeline/head This commit looks good

This commit is contained in:
Deepak Mallubhotla 2022-03-28 18:51:52 -05:00
parent e1e8c8490a
commit 6231ecc203
Signed by: deepak
GPG Key ID: BEBAEBF28083E022
32 changed files with 1514 additions and 773 deletions

7
.editorconfig Normal file
View File

@ -0,0 +1,7 @@
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
# insert_final_newline = true
indent_style = tab

3
.flake8 Normal file
View File

@ -0,0 +1,3 @@
[flake8]
ignore = W191, E501, W503, W504
max-line-length = 120

282
.gitignore vendored
View File

@ -1,140 +1,142 @@
.idea/**/*
# 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/
# 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
pytest.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/
.csv
.idea

10
.versionrc Normal file
View File

@ -0,0 +1,10 @@
{
"bumpFiles": [
{
"filename": "pyproject.toml",
"updater": "scripts/standard-version/pyproject-updater.js"
}
],
"sign": true,
"tag-prefix": ""
}

81
Jenkinsfile vendored Normal file
View File

@ -0,0 +1,81 @@
pipeline {
agent {
kubernetes {
label 'pynam' // all your pods will be named with this prefix, followed by a unique id
idleMinutes 5 // how long the pod will live after no jobs have run on it
yamlFile 'jenkins/ci-agent-pod.yaml' // path to the pod definition relative to the root of our project
defaultContainer 'poetry' // define a default container if more than a few stages use it, will default to jnlp container
}
}
options {
parallelsAlwaysFailFast()
}
stages {
stage('Build') {
steps {
echo 'Building...'
sh 'python --version'
sh 'poetry --version'
sh 'poetry install'
}
}
stage('Test') {
parallel{
stage('pytest') {
steps {
sh 'poetry run pytest --benchmark-skip'
}
}
stage('lint') {
steps {
sh 'poetry run flake8 pynam tests'
}
}
stage('mypy') {
steps {
sh 'poetry run mypy pynam'
}
}
}
}
stage('Deploy') {
environment {
PYPI=credentials("pypi-pynam")
}
when {
buildingTag()
}
steps {
echo 'Deploying...'
sh 'poetry publish -u ${PYPI_USR} -p ${PYPI_PSW} --build'
}
}
}
post {
always {
echo 'This will always run'
junit 'pytest.xml'
cobertura coberturaReportFile: 'coverage.xml'
mail (bcc: '',
body: "Project: ${env.JOB_NAME} <br>Build Number: ${env.BUILD_NUMBER} <br> Build URL: ${env.BUILD_URL}", cc: '', charset: 'UTF-8', from: 'jenkins@jenkins.deepak.science', mimeType: 'text/html', replyTo: 'dmallubhotla+jenkins@gmail.com', subject: "${env.JOB_NAME} #${env.BUILD_NUMBER}: Build ${currentBuild.currentResult}", to: "dmallubhotla+ci@gmail.com")
}
success {
echo 'This will run only if successful'
}
failure {
echo 'This will run only if failed'
}
unstable {
echo 'This will run only if the run was marked as unstable'
}
changed {
echo 'This will run only if the state of the Pipeline has changed'
echo 'For example, if the Pipeline was previously failing but is now successful'
}
}
}

38
do.sh Normal file
View File

@ -0,0 +1,38 @@
#!/usr/bin/env bash
# Do - The Simplest Build Tool on Earth.
# Documentation and examples see https://github.com/8gears/do
set -Eeuo pipefail # -e "Automatic exit from bash shell script on error" -u "Treat unset variables and parameters as errors"
build() {
echo "I am ${FUNCNAME[0]}ing"
poetry build
}
fmt() {
poetry run black .
find . -type f -name "*.py" -exec sed -i -e 's/ /\t/g' {} \;
}
test() {
echo "I am ${FUNCNAME[0]}ing"
poetry run flake8 pynam tests
poetry run mypy pynam
poetry run pytest
}
htmlcov() {
poetry run pytest --cov-report=html
}
release() {
./scripts/release.sh
}
all() {
build && test
}
"$@" # <- execute the task
[ "$#" -gt 0 ] || printf "Usage:\n\t./do.sh %s\n" "($(compgen -A function | grep '^[^_]' | paste -sd '|' -))"

16
jenkins/ci-agent-pod.yaml Normal file
View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Pod
spec:
imagePullSecrets:
- name: regcreds
containers: # list of containers that you want present for your build, you can define a default container in the Jenkinsfile
- name: poetry
image: ghcr.io/dmallubhotla/poetry-image:1
command: ["tail", "-f", "/dev/null"] # this or any command that is bascially a noop is required, this is so that you don't overwrite the entrypoint of the base container
imagePullPolicy: Always # use cache or pull image for agent
resources: # limits the resources your build contaienr
requests:
memory: "2Gi"
cpu: "500m"
limits:
memory: "2Gi"

799
poetry.lock generated
View File

@ -1,260 +1,539 @@
[[package]]
category = "dev"
description = "Atomic file writes."
name = "atomicwrites"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.4.0"
[[package]]
category = "dev"
description = "Classes Without Boilerplate"
name = "attrs"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "19.3.0"
[package.extras]
azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"]
docs = ["sphinx", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
[[package]]
category = "dev"
description = "Cross-platform colored terminal text."
marker = "sys_platform == \"win32\""
name = "colorama"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.4.3"
[[package]]
category = "dev"
description = "Read metadata from Python packages"
marker = "python_version < \"3.8\""
name = "importlib-metadata"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
version = "1.7.0"
[package.dependencies]
zipp = ">=0.5"
[package.extras]
docs = ["sphinx", "rst.linker"]
testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
[[package]]
category = "dev"
description = "More routines for operating on iterables, beyond itertools"
name = "more-itertools"
optional = false
python-versions = ">=3.5"
version = "8.4.0"
[[package]]
category = "main"
description = "NumPy is the fundamental package for array computing with Python."
name = "numpy"
optional = false
python-versions = ">=3.6"
version = "1.19.0"
[[package]]
category = "dev"
description = "plugin and hook calling mechanisms for python"
name = "pluggy"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.13.1"
[package.dependencies]
[package.dependencies.importlib-metadata]
python = "<3.8"
version = ">=0.12"
[package.extras]
dev = ["pre-commit", "tox"]
[[package]]
category = "dev"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
name = "py"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.9.0"
[[package]]
category = "dev"
description = "Get CPU info with pure Python 2 & 3"
name = "py-cpuinfo"
optional = false
python-versions = "*"
version = "7.0.0"
[[package]]
category = "dev"
description = "pytest: simple powerful testing with Python"
name = "pytest"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "3.10.1"
[package.dependencies]
atomicwrites = ">=1.0"
attrs = ">=17.4.0"
colorama = "*"
more-itertools = ">=4.0.0"
pluggy = ">=0.7"
py = ">=1.5.0"
setuptools = "*"
six = ">=1.10.0"
[[package]]
category = "dev"
description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer. See calibration_ and FAQ_."
name = "pytest-benchmark"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "3.2.3"
[package.dependencies]
py-cpuinfo = "*"
pytest = ">=3.8"
[package.extras]
aspect = ["aspectlib"]
elasticsearch = ["elasticsearch"]
histogram = ["pygal", "pygaljs"]
[[package]]
category = "main"
description = "SciPy: Scientific Library for Python"
name = "scipy"
optional = false
python-versions = ">=3.6"
version = "1.5.1"
[package.dependencies]
numpy = ">=1.14.5"
[[package]]
category = "dev"
description = "Python 2 and 3 compatibility utilities"
name = "six"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
version = "1.15.0"
[[package]]
category = "dev"
description = "Backport of pathlib-compatible object wrapper for zip files"
marker = "python_version < \"3.8\""
name = "zipp"
optional = false
python-versions = ">=3.6"
version = "3.1.0"
[package.extras]
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
testing = ["jaraco.itertools", "func-timeout"]
[metadata]
content-hash = "02f8a795ac396fe3c5adcc163c673e4e53b1c63fb5d0840c5319169093cd3a5f"
python-versions = "^3.7"
[metadata.files]
atomicwrites = [
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
]
attrs = [
{file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"},
{file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"},
]
colorama = [
{file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
{file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
]
importlib-metadata = [
{file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"},
{file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"},
]
more-itertools = [
{file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"},
{file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"},
]
numpy = [
{file = "numpy-1.19.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:63d971bb211ad3ca37b2adecdd5365f40f3b741a455beecba70fd0dde8b2a4cb"},
{file = "numpy-1.19.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b6aaeadf1e4866ca0fdf7bb4eed25e521ae21a7947c59f78154b24fc7abbe1dd"},
{file = "numpy-1.19.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:13af0184177469192d80db9bd02619f6fa8b922f9f327e077d6f2a6acb1ce1c0"},
{file = "numpy-1.19.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:356f96c9fbec59974a592452ab6a036cd6f180822a60b529a975c9467fcd5f23"},
{file = "numpy-1.19.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa1fe75b4a9e18b66ae7f0b122543c42debcf800aaafa0212aaff3ad273c2596"},
{file = "numpy-1.19.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:cbe326f6d364375a8e5a8ccb7e9cd73f4b2f6dc3b2ed205633a0db8243e2a96a"},
{file = "numpy-1.19.0-cp36-cp36m-win32.whl", hash = "sha256:a2e3a39f43f0ce95204beb8fe0831199542ccab1e0c6e486a0b4947256215632"},
{file = "numpy-1.19.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7b852817800eb02e109ae4a9cef2beda8dd50d98b76b6cfb7b5c0099d27b52d4"},
{file = "numpy-1.19.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d97a86937cf9970453c3b62abb55a6475f173347b4cde7f8dcdb48c8e1b9952d"},
{file = "numpy-1.19.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a86c962e211f37edd61d6e11bb4df7eddc4a519a38a856e20a6498c319efa6b0"},
{file = "numpy-1.19.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d34fbb98ad0d6b563b95de852a284074514331e6b9da0a9fc894fb1cdae7a79e"},
{file = "numpy-1.19.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:658624a11f6e1c252b2cd170d94bf28c8f9410acab9f2fd4369e11e1cd4e1aaf"},
{file = "numpy-1.19.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:4d054f013a1983551254e2379385e359884e5af105e3efe00418977d02f634a7"},
{file = "numpy-1.19.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:26a45798ca2a4e168d00de75d4a524abf5907949231512f372b217ede3429e98"},
{file = "numpy-1.19.0-cp37-cp37m-win32.whl", hash = "sha256:3c40c827d36c6d1c3cf413694d7dc843d50997ebffbc7c87d888a203ed6403a7"},
{file = "numpy-1.19.0-cp37-cp37m-win_amd64.whl", hash = "sha256:be62aeff8f2f054eff7725f502f6228298891fd648dc2630e03e44bf63e8cee0"},
{file = "numpy-1.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dd53d7c4a69e766e4900f29db5872f5824a06827d594427cf1a4aa542818b796"},
{file = "numpy-1.19.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:30a59fb41bb6b8c465ab50d60a1b298d1cd7b85274e71f38af5a75d6c475d2d2"},
{file = "numpy-1.19.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:df1889701e2dfd8ba4dc9b1a010f0a60950077fb5242bb92c8b5c7f1a6f2668a"},
{file = "numpy-1.19.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:33c623ef9ca5e19e05991f127c1be5aeb1ab5cdf30cb1c5cf3960752e58b599b"},
{file = "numpy-1.19.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:26f509450db547e4dfa3ec739419b31edad646d21fb8d0ed0734188b35ff6b27"},
{file = "numpy-1.19.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7b57f26e5e6ee2f14f960db46bd58ffdca25ca06dd997729b1b179fddd35f5a3"},
{file = "numpy-1.19.0-cp38-cp38-win32.whl", hash = "sha256:a8705c5073fe3fcc297fb8e0b31aa794e05af6a329e81b7ca4ffecab7f2b95ef"},
{file = "numpy-1.19.0-cp38-cp38-win_amd64.whl", hash = "sha256:c2edbb783c841e36ca0fa159f0ae97a88ce8137fb3a6cd82eae77349ba4b607b"},
{file = "numpy-1.19.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:8cde829f14bd38f6da7b2954be0f2837043e8b8d7a9110ec5e318ae6bf706610"},
{file = "numpy-1.19.0.zip", hash = "sha256:76766cc80d6128750075378d3bb7812cf146415bd29b588616f72c943c00d598"},
]
pluggy = [
{file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
]
py = [
{file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"},
{file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"},
]
py-cpuinfo = [
{file = "py-cpuinfo-7.0.0.tar.gz", hash = "sha256:9aa2e49675114959697d25cf57fec41c29b55887bff3bc4809b44ac6f5730097"},
]
pytest = [
{file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"},
{file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"},
]
pytest-benchmark = [
{file = "pytest-benchmark-3.2.3.tar.gz", hash = "sha256:ad4314d093a3089701b24c80a05121994c7765ce373478c8f4ba8d23c9ba9528"},
{file = "pytest_benchmark-3.2.3-py2.py3-none-any.whl", hash = "sha256:01f79d38d506f5a3a0a9ada22ded714537bbdfc8147a881a35c1655db07289d9"},
]
scipy = [
{file = "scipy-1.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:058e84930407927f71963a4ad8c1dc96c4d2d075636a68578195648c81f78810"},
{file = "scipy-1.5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:7908c85854c5b5b6d3ce7fefafac1ca3e23ff9ac41edabc2d46ae5dc9fa070ac"},
{file = "scipy-1.5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8302d69fb1528ea7c7f2a1ea640d354c981b6eb8192d1c175349874209397604"},
{file = "scipy-1.5.1-cp36-cp36m-win32.whl", hash = "sha256:35d042d6499caf1a5d171baed0ebf01eb665b7af2ad98a8ff1b0e6e783654540"},
{file = "scipy-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5e0bb43ff581811ab7f27425f6b96c1ddf7591ccad2e486c9af0b910c18f7185"},
{file = "scipy-1.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4858ccbd88f4b53950fb9fc0069c1d9fea83d7cff2382e1d8b023d3f4883014"},
{file = "scipy-1.5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:eb46d8b5947ca27b0bc972cecfba8130f088a83ab3d08c1a6033d9070b3046b3"},
{file = "scipy-1.5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fff15df01bef1243468be60c55178ed7576270b200aab08a7ffd5b8e0bbc340c"},
{file = "scipy-1.5.1-cp37-cp37m-win32.whl", hash = "sha256:81859ed3aad620752dd2c07c32b5d3a80a0d47c5e3813904621954a78a0ae899"},
{file = "scipy-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c05c6fe76228cc13c5214e9faf5f2a871a1da54473bc417ab9da310d0e5fff8b"},
{file = "scipy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71742889393a724dfce755b6b61228677873d269a4234e51ddaf08b998433c91"},
{file = "scipy-1.5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9323d268775991b79690f7b9a28a4e8b8c4f2b160ed9f8a90123127314e2d3c1"},
{file = "scipy-1.5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:06b19a650471781056c1a2172eeeeb777b8b516e9434005dd392a4559e0938b9"},
{file = "scipy-1.5.1-cp38-cp38-win32.whl", hash = "sha256:57a0f2be3063dbe1e3daf31ec9005576e8fd1022a28159d0db71d14566899d16"},
{file = "scipy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:c06e731aa46c0dfc563cc636155758178ebc019ef78b9b0f4370effe2ac0f0e6"},
{file = "scipy-1.5.1.tar.gz", hash = "sha256:039572f0ca9578a466683558c5bf1e65d442860ec6e13307d528749cfe6d07b8"},
]
six = [
{file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
{file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
]
zipp = [
{file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"},
{file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"},
]
[[package]]
name = "atomicwrites"
version = "1.4.0"
description = "Atomic file writes."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "attrs"
version = "21.4.0"
description = "Classes Without Boilerplate"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.extras]
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
[[package]]
name = "black"
version = "22.3.0"
description = "The uncompromising code formatter."
category = "dev"
optional = false
python-versions = ">=3.6.2"
[package.dependencies]
click = ">=8.0.0"
mypy-extensions = ">=0.4.3"
pathspec = ">=0.9.0"
platformdirs = ">=2"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
[package.extras]
colorama = ["colorama (>=0.4.3)"]
d = ["aiohttp (>=3.7.4)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "click"
version = "8.1.0"
description = "Composable command line interface toolkit"
category = "dev"
optional = false
python-versions = ">=3.7"
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "colorama"
version = "0.4.4"
description = "Cross-platform colored terminal text."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "coverage"
version = "6.3.2"
description = "Code coverage measurement for Python"
category = "dev"
optional = false
python-versions = ">=3.7"
[package.dependencies]
tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
[package.extras]
toml = ["tomli"]
[[package]]
name = "flake8"
version = "4.0.1"
description = "the modular source code checker: pep8 pyflakes and co"
category = "dev"
optional = false
python-versions = ">=3.6"
[package.dependencies]
mccabe = ">=0.6.0,<0.7.0"
pycodestyle = ">=2.8.0,<2.9.0"
pyflakes = ">=2.4.0,<2.5.0"
[[package]]
name = "iniconfig"
version = "1.1.1"
description = "iniconfig: brain-dead simple config-ini parsing"
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "mccabe"
version = "0.6.1"
description = "McCabe checker, plugin for flake8"
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "mypy"
version = "0.942"
description = "Optional static typing for Python"
category = "dev"
optional = false
python-versions = ">=3.6"
[package.dependencies]
mypy-extensions = ">=0.4.3"
tomli = ">=1.1.0"
typing-extensions = ">=3.10"
[package.extras]
dmypy = ["psutil (>=4.0)"]
python2 = ["typed-ast (>=1.4.0,<2)"]
reports = ["lxml"]
[[package]]
name = "mypy-extensions"
version = "0.4.3"
description = "Experimental type system extensions for programs checked with the mypy typechecker."
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "numpy"
version = "1.22.3"
description = "NumPy is the fundamental package for array computing with Python."
category = "main"
optional = false
python-versions = ">=3.8"
[[package]]
name = "packaging"
version = "21.3"
description = "Core utilities for Python packages"
category = "dev"
optional = false
python-versions = ">=3.6"
[package.dependencies]
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
[[package]]
name = "pathspec"
version = "0.9.0"
description = "Utility library for gitignore style pattern matching of file paths."
category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
[[package]]
name = "platformdirs"
version = "2.5.1"
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
category = "dev"
optional = false
python-versions = ">=3.7"
[package.extras]
docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
[[package]]
name = "pluggy"
version = "1.0.0"
description = "plugin and hook calling mechanisms for python"
category = "dev"
optional = false
python-versions = ">=3.6"
[package.extras]
dev = ["pre-commit", "tox"]
testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "py"
version = "1.11.0"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "py-cpuinfo"
version = "8.0.0"
description = "Get CPU info with pure Python 2 & 3"
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "pycodestyle"
version = "2.8.0"
description = "Python style guide checker"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "pyflakes"
version = "2.4.0"
description = "passive checker of Python programs"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "pyparsing"
version = "3.0.7"
description = "Python parsing module"
category = "dev"
optional = false
python-versions = ">=3.6"
[package.extras]
diagrams = ["jinja2", "railroad-diagrams"]
[[package]]
name = "pytest"
version = "7.1.1"
description = "pytest: simple powerful testing with Python"
category = "dev"
optional = false
python-versions = ">=3.7"
[package.dependencies]
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
attrs = ">=19.2.0"
colorama = {version = "*", markers = "sys_platform == \"win32\""}
iniconfig = "*"
packaging = "*"
pluggy = ">=0.12,<2.0"
py = ">=1.8.2"
tomli = ">=1.0.0"
[package.extras]
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
[[package]]
name = "pytest-benchmark"
version = "3.4.1"
description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.dependencies]
py-cpuinfo = "*"
pytest = ">=3.8"
[package.extras]
aspect = ["aspectlib"]
elasticsearch = ["elasticsearch"]
histogram = ["pygal", "pygaljs"]
[[package]]
name = "pytest-cov"
version = "3.0.0"
description = "Pytest plugin for measuring coverage."
category = "dev"
optional = false
python-versions = ">=3.6"
[package.dependencies]
coverage = {version = ">=5.2.1", extras = ["toml"]}
pytest = ">=4.6"
[package.extras]
testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
[[package]]
name = "scipy"
version = "1.8.0"
description = "SciPy: Scientific Library for Python"
category = "main"
optional = false
python-versions = ">=3.8,<3.11"
[package.dependencies]
numpy = ">=1.17.3,<1.25.0"
[[package]]
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
category = "dev"
optional = false
python-versions = ">=3.7"
[[package]]
name = "typing-extensions"
version = "4.1.1"
description = "Backported and Experimental Type Hints for Python 3.6+"
category = "dev"
optional = false
python-versions = ">=3.6"
[metadata]
lock-version = "1.1"
python-versions = "^3.8,<3.10"
content-hash = "d7ee7d61a1643514f418ae5fd9d76c6557a597bc9bf43355ed335db8f1fdda7d"
[metadata.files]
atomicwrites = [
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
]
attrs = [
{file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
{file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
]
black = [
{file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"},
{file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"},
{file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"},
{file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"},
{file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"},
{file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"},
{file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"},
{file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"},
{file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"},
{file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"},
{file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"},
{file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"},
{file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"},
{file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"},
{file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"},
{file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"},
{file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"},
{file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"},
{file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"},
{file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"},
{file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"},
{file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
{file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
]
click = [
{file = "click-8.1.0-py3-none-any.whl", hash = "sha256:19a4baa64da924c5e0cd889aba8e947f280309f1a2ce0947a3e3a7bcb7cc72d6"},
{file = "click-8.1.0.tar.gz", hash = "sha256:977c213473c7665d3aa092b41ff12063227751c41d7b17165013e10069cc5cd2"},
]
colorama = [
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
]
coverage = [
{file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"},
{file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"},
{file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"},
{file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"},
{file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"},
{file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"},
{file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"},
{file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"},
{file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"},
{file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"},
{file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"},
{file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"},
{file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"},
{file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"},
{file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"},
{file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"},
{file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"},
{file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"},
{file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"},
{file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"},
{file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"},
{file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"},
{file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"},
{file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"},
{file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"},
{file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"},
{file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"},
{file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"},
{file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"},
{file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"},
{file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"},
{file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"},
{file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"},
{file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"},
{file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"},
{file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"},
{file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"},
{file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"},
{file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"},
{file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"},
{file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"},
]
flake8 = [
{file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
{file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
]
iniconfig = [
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
]
mccabe = [
{file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
]
mypy = [
{file = "mypy-0.942-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d"},
{file = "mypy-0.942-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46"},
{file = "mypy-0.942-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0"},
{file = "mypy-0.942-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"},
{file = "mypy-0.942-cp310-cp310-win_amd64.whl", hash = "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17"},
{file = "mypy-0.942-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904"},
{file = "mypy-0.942-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5"},
{file = "mypy-0.942-cp36-cp36m-win_amd64.whl", hash = "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c"},
{file = "mypy-0.942-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58"},
{file = "mypy-0.942-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6"},
{file = "mypy-0.942-cp37-cp37m-win_amd64.whl", hash = "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e"},
{file = "mypy-0.942-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67"},
{file = "mypy-0.942-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c"},
{file = "mypy-0.942-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b"},
{file = "mypy-0.942-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3"},
{file = "mypy-0.942-cp38-cp38-win_amd64.whl", hash = "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8"},
{file = "mypy-0.942-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca"},
{file = "mypy-0.942-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16"},
{file = "mypy-0.942-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6"},
{file = "mypy-0.942-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322"},
{file = "mypy-0.942-cp39-cp39-win_amd64.whl", hash = "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534"},
{file = "mypy-0.942-py3-none-any.whl", hash = "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db"},
{file = "mypy-0.942.tar.gz", hash = "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2"},
]
mypy-extensions = [
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
]
numpy = [
{file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"},
{file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"},
{file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"},
{file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"},
{file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"},
{file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"},
{file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"},
{file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"},
{file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"},
{file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"},
{file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"},
{file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"},
{file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"},
{file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"},
{file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"},
{file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"},
{file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"},
{file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"},
{file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"},
{file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"},
]
packaging = [
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
]
pathspec = [
{file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
{file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
]
platformdirs = [
{file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"},
{file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"},
]
pluggy = [
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
]
py = [
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
]
py-cpuinfo = [
{file = "py-cpuinfo-8.0.0.tar.gz", hash = "sha256:5f269be0e08e33fd959de96b34cd4aeeeacac014dd8305f70eb28d06de2345c5"},
]
pycodestyle = [
{file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
{file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
]
pyflakes = [
{file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
{file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
]
pyparsing = [
{file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"},
{file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"},
]
pytest = [
{file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"},
{file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"},
]
pytest-benchmark = [
{file = "pytest-benchmark-3.4.1.tar.gz", hash = "sha256:40e263f912de5a81d891619032983557d62a3d85843f9a9f30b98baea0cd7b47"},
{file = "pytest_benchmark-3.4.1-py2.py3-none-any.whl", hash = "sha256:36d2b08c4882f6f997fd3126a3d6dfd70f3249cde178ed8bbc0b73db7c20f809"},
]
pytest-cov = [
{file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
{file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
]
scipy = [
{file = "scipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87b01c7d5761e8a266a0fbdb9d88dcba0910d63c1c671bdb4d99d29f469e9e03"},
{file = "scipy-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ae3e327da323d82e918e593460e23babdce40d7ab21490ddf9fc06dec6b91a18"},
{file = "scipy-1.8.0-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:16e09ef68b352d73befa8bcaf3ebe25d3941fe1a58c82909d5589856e6bc8174"},
{file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c17a1878d00a5dd2797ccd73623ceca9d02375328f6218ee6d921e1325e61aff"},
{file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937d28722f13302febde29847bbe554b89073fbb924a30475e5ed7b028898b5f"},
{file = "scipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f4d059a97b29c91afad46b1737274cb282357a305a80bdd9e8adf3b0ca6a3f0"},
{file = "scipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:38aa39b6724cb65271e469013aeb6f2ce66fd44f093e241c28a9c6bc64fd79ed"},
{file = "scipy-1.8.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559a8a4c03a5ba9fe3232f39ed24f86457e4f3f6c0abbeae1fb945029f092720"},
{file = "scipy-1.8.0-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:f4a6d3b9f9797eb2d43938ac2c5d96d02aed17ef170c8b38f11798717523ddba"},
{file = "scipy-1.8.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b2c2af4183ed09afb595709a8ef5783b2baf7f41e26ece24e1329c109691a7"},
{file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a279e27c7f4566ef18bab1b1e2c37d168e365080974758d107e7d237d3f0f484"},
{file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5be4039147c808e64f99c0e8a9641eb5d2fa079ff5894dcd8240e94e347af4"},
{file = "scipy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3d9dd6c8b93a22bf9a3a52d1327aca7e092b1299fb3afc4f89e8eba381be7b59"},
{file = "scipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e73343c5e0d413c1f937302b2e04fb07872f5843041bcfd50699aef6e95e399"},
{file = "scipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de2e80ee1d925984c2504812a310841c241791c5279352be4707cdcd7c255039"},
{file = "scipy-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c2bae431d127bf0b1da81fc24e4bba0a84d058e3a96b9dd6475dfcb3c5e8761e"},
{file = "scipy-1.8.0-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:723b9f878095ed994756fa4ee3060c450e2db0139c5ba248ee3f9628bd64e735"},
{file = "scipy-1.8.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:011d4386b53b933142f58a652aa0f149c9b9242abd4f900b9f4ea5fbafc86b89"},
{file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f0cd9c0bd374ef834ee1e0f0999678d49dcc400ea6209113d81528958f97c7"},
{file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3720d0124aced49f6f2198a6900304411dbbeed12f56951d7c66ebef05e3df6"},
{file = "scipy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:3d573228c10a3a8c32b9037be982e6440e411b443a6267b067cac72f690b8d56"},
{file = "scipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb7088e89cd751acf66195d2f00cf009a1ea113f3019664032d9075b1e727b6c"},
{file = "scipy-1.8.0.tar.gz", hash = "sha256:31d4f2d6b724bc9a98e527b5849b8a7e589bf1ea630c33aa563eda912c9ff0bd"},
]
tomli = [
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
]
typing-extensions = [
{file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"},
{file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
]

View File

@ -1 +1 @@
__version__ = '0.1.0'
__version__ = "0.1.0"

View File

@ -1,8 +1,13 @@
class CalculationConstants(object):
"""Holds physical constants, in SI units
"""
"""Holds physical constants, in SI units"""
def __init__(self, epsilon_0=8.854e-12, h_bar=1.0546e-34, c_light=3e8, electron_mass=9.10938356e-31):
def __init__(
self,
epsilon_0=8.854e-12,
h_bar=1.0546e-34,
c_light=3e8,
electron_mass=9.10938356e-31,
):
"""Initialises constants in SI units, with sensible defaults
:param epsilon_0:
@ -18,11 +23,18 @@ class CalculationConstants(object):
class CalculationParams(object):
"""Holds the parameters describing a calculation, in SI units.
"""
"""Holds the parameters describing a calculation, in SI units."""
def __init__(self, omega: float = None, omega_p: float = None, tau: float = None, v_f: float = None,
t_rel: float = None, t_c: float = None, dipole_moment: float = None):
def __init__(
self,
omega: float = None,
omega_p: float = None,
tau: float = None,
v_f: float = None,
t_rel: float = None,
t_c: float = None,
dipole_moment: float = None,
):
"""Creates parameter object, SI units
:param omega:

View File

@ -1,2 +1,4 @@
from pynam.dielectric.nam_dielectric_coefficient_approximator import get_nam_dielectric
from pynam.dielectric.lindhard_dielectric import get_lindhard_dielectric
__all__ = ["get_nam_dielectric", "get_lindhard_dielectric"]

View File

@ -5,10 +5,21 @@ LINDHARD_SERIES_THRESHOLD = 1e4
class LindhardDielectric(object):
def __init__(self,
params: CalculationParams,
constants: CalculationConstants = CalculationConstants(),
thres=LINDHARD_SERIES_THRESHOLD):
def __init__(
self,
params: CalculationParams,
constants: CalculationConstants = CalculationConstants(),
thres=LINDHARD_SERIES_THRESHOLD,
):
if params.omega is None:
raise ValueError("omega expected to not be None")
if params.v_f is None:
raise ValueError("v_f expected to not be None")
if params.omega_p is None:
raise ValueError("omega_p expected to not be None")
if params.tau is None:
raise ValueError("tau expected to not be None")
self.series_threshold = thres
self.omega = params.omega
self.v_f = params.v_f
@ -17,12 +28,11 @@ class LindhardDielectric(object):
self.c_light = constants.c_light
self.s = 1 / (self.tau * self.omega)
self.prefactor = 3 * (self.omega_p ** 2) / (self.omega ** 2)
self.prefactor = 3 * (self.omega_p**2) / (self.omega**2)
def get_eps(self):
def eps_lindhard(u_inverse_wavelength: float) -> complex:
""" the lindhard dielectric function
"""the lindhard dielectric function
:param u_inverse_wavelength: u is in units of the reciprocal vacuum wavelength (omega / c_light)
:return: returns the value of epsilon, dimensionless
@ -37,22 +47,26 @@ class LindhardDielectric(object):
return eps_full_lindhard(u)
def eps_series(u: float) -> complex:
rel_value = (
(1j / (3 * (self.s - 1j))) + u ** 2 * ((-9j + 5 * self.s) / (45 * (-1j + self.s) ** 3))
rel_value = (1j / (3 * (self.s - 1j))) + (
u**2 * ((-9j + 5 * self.s) / (45 * (-1j + self.s) ** 3))
)
return 1 + (self.prefactor * rel_value)
def eps_full_lindhard(u: float) -> complex:
log_value = np.log((1 - u + (self.s * 1j)) / (1 + u + (self.s * 1j)))
rel_value = (1 + ((1 + (self.s * 1j)) / (2 * u)) * log_value) / (1 + ((self.s * 1j) / (2 * u)) * log_value)
rel_value = (1 + ((1 + (self.s * 1j)) / (2 * u)) * log_value) / (
1 + ((self.s * 1j) / (2 * u)) * log_value
)
return 1 + (self.prefactor / (u ** 2)) * rel_value
return 1 + (self.prefactor / (u**2)) * rel_value
return eps_lindhard
def get_lindhard_dielectric(params: CalculationParams,
constants: CalculationConstants = CalculationConstants()):
def get_lindhard_dielectric(
params: CalculationParams, constants: CalculationConstants = CalculationConstants()
):
return LindhardDielectric(params, constants).get_eps()

View File

@ -5,17 +5,17 @@ import pynam.util
def g(w, wp):
return ((wp * (w + wp)) + 1) / (csqrt(wp ** 2 - 1) * csqrt((w + wp) ** 2 - 1))
return ((wp * (w + wp)) + 1) / (csqrt(wp**2 - 1) * csqrt((w + wp) ** 2 - 1))
def f(k, e, v):
return ((4 / 3) * 1 / (e - 1j * v)) + (4 / 15) * (1 / ((e - 1j * v) ** 3)) * k ** 2
return ((4 / 3) * 1 / (e - 1j * v)) + (4 / 15) * (1 / ((e - 1j * v) ** 3)) * k**2
def i1(w, wp, k, v):
gv = g(w, wp)
e1 = csqrt((w + wp) ** 2 - 1)
e2 = csqrt(wp ** 2 - 1)
e2 = csqrt(wp**2 - 1)
f_upper = f(k, np.real(e1 - e2), np.imag(e1 + e2) + 2 * v) * (gv + 1)
f_lower = f(k, np.real(-e1 - e2), np.imag(e1 + e2) + 2 * v) * (gv - 1)
@ -26,7 +26,7 @@ def i1(w, wp, k, v):
def i2(w, wp, k, v):
gv = g(w, wp)
e1 = csqrt((w + wp) ** 2 - 1)
e2 = csqrt(wp ** 2 - 1)
e2 = csqrt(wp**2 - 1)
f_upper = f(k, np.real(e1 - e2), np.imag(e1 + e2) + 2 * v) * (gv + 1)
f_lower = f(k, np.real(e1 + e2), np.imag(e1 + e2) + 2 * v) * (gv - 1)
@ -36,19 +36,18 @@ def i2(w, wp, k, v):
def a(w, k, v, t):
return pynam.util.complex_quad(
lambda wp: np.tanh((w + wp) / (2 * t)) * (i1(w, wp, k, v)),
1 - w, 1
lambda wp: np.tanh((w + wp) / (2 * t)) * (i1(w, wp, k, v)), 1 - w, 1
)[0]
def b_int(wp, w, k, v, t):
return (np.tanh((w + wp) / (2 * t)) * i1(w, wp, k, v)) - (np.tanh(wp / (2 * t)) * i2(w, wp, k, v))
return (np.tanh((w + wp) / (2 * t)) * i1(w, wp, k, v)) - (
np.tanh(wp / (2 * t)) * i2(w, wp, k, v)
)
def b(w, k, v, t, b_max=np.inf):
return pynam.util.complex_quad(
lambda wp: b_int(wp, w, k, v, t), 1, b_max
)[0]
return pynam.util.complex_quad(lambda wp: b_int(wp, w, k, v, t), 1, b_max)[0]
def sigma_nam_alk(w, k, v, t):

View File

@ -11,14 +11,15 @@ FIXED_LARGE_MOMENTUM = 1e8
class DedimensionalisedParameters(object):
def __init__(
self,
omega: float,
sigma_n: float,
tau: float,
v_f: float,
temp: float,
critical_temp: float,
c_light: float):
self,
omega: float,
sigma_n: float,
tau: float,
v_f: float,
temp: float,
critical_temp: float,
c_light: float,
):
gap = 0
if temp < critical_temp:
# else, problems will happen
@ -39,7 +40,6 @@ class NamDielectricCoefficients(object):
self.u_l = np.real((-self.c + 1j * self.d) / (-self.a + 1j * self.b))
def eps(self, u_c: float):
def piecewise_eps(u: float):
# todo add check for u_c vs u_l
if u < self.u_l:
@ -53,41 +53,50 @@ class NamDielectricCoefficients(object):
def get_dedimensionalised_parameters(
omega: float,
sigma_n: float,
tau: float,
v_f: float,
temp: float,
critical_temp: float,
c_light: float) -> DedimensionalisedParameters:
return DedimensionalisedParameters(omega, sigma_n, tau, v_f, temp, critical_temp, c_light)
omega: float,
sigma_n: float,
tau: float,
v_f: float,
temp: float,
critical_temp: float,
c_light: float,
) -> DedimensionalisedParameters:
return DedimensionalisedParameters(
omega, sigma_n, tau, v_f, temp, critical_temp, c_light
)
def get_small_momentum_coefficients(dedim_params: DedimensionalisedParameters) -> Tuple[float, float]:
def get_small_momentum_coefficients(
dedim_params: DedimensionalisedParameters,
) -> Tuple[float, float]:
prefactor = 4j * np.pi * dedim_params.b
s = pynam.dielectric.low_k_nam.sigma_nam_alk(dedim_params.xi, 0, dedim_params.nu, dedim_params.t)
s = pynam.dielectric.low_k_nam.sigma_nam_alk(
dedim_params.xi, 0, dedim_params.nu, dedim_params.t
)
conductivity = prefactor * s
return -np.real(conductivity), np.imag(conductivity)
def get_big_momentum_coefficients(dedim_params: DedimensionalisedParameters) -> Tuple[float, float]:
def get_big_momentum_coefficients(
dedim_params: DedimensionalisedParameters,
) -> Tuple[float, float]:
prefactor = 4j * np.pi * dedim_params.b * FIXED_LARGE_MOMENTUM / dedim_params.a
s = pynam.dielectric.sigma_nam.sigma_nam(dedim_params.xi,
FIXED_LARGE_MOMENTUM,
dedim_params.nu,
dedim_params.t)
s = pynam.dielectric.sigma_nam.sigma_nam(
dedim_params.xi, FIXED_LARGE_MOMENTUM, dedim_params.nu, dedim_params.t
)
conductivity = prefactor * s
return -np.real(conductivity), np.imag(conductivity)
def get_nam_dielectric_coefficients(
omega: float,
sigma_n: float,
tau: float,
v_f: float,
temp: float,
crit_temp: float,
c_light: float) -> NamDielectricCoefficients:
omega: float,
sigma_n: float,
tau: float,
v_f: float,
temp: float,
crit_temp: float,
c_light: float,
) -> NamDielectricCoefficients:
"""Gets a NamDielectricCoefficients object, using SI unit parameters
:param omega: frequency
@ -100,20 +109,40 @@ def get_nam_dielectric_coefficients(
:return:
"""
dedim = get_dedimensionalised_parameters(omega, sigma_n, tau, v_f, temp, crit_temp, c_light)
dedim = get_dedimensionalised_parameters(
omega, sigma_n, tau, v_f, temp, crit_temp, c_light
)
a, b = get_small_momentum_coefficients(dedim)
c, d = get_big_momentum_coefficients(dedim)
return NamDielectricCoefficients(a, b, c, d)
def get_nam_dielectric(u_c: float, params: CalculationParams, constants: CalculationConstants = CalculationConstants()):
def get_nam_dielectric(
u_c: float,
params: CalculationParams,
constants: CalculationConstants = CalculationConstants(),
):
if params.omega is None:
raise ValueError("omega expected to not be None")
if params.v_f is None:
raise ValueError("v_f expected to not be None")
if params.omega_p is None:
raise ValueError("omega_p expected to not be None")
if params.tau is None:
raise ValueError("tau expected to not be None")
if params.t_rel is None:
raise ValueError("relative temp expected to not be None")
if params.t_c is None:
raise ValueError("critical temp expected to not be None")
sigma_n = params.omega_p**2 * params.tau / (4 * np.pi)
coeffs = get_nam_dielectric_coefficients(params.omega,
sigma_n,
params.tau,
params.v_f,
params.t_rel * params.t_c,
params.t_c,
constants.c_light)
coeffs = get_nam_dielectric_coefficients(
params.omega,
sigma_n,
params.tau,
params.v_f,
params.t_rel * params.t_c,
params.t_c,
constants.c_light,
)
return coeffs.eps(u_c)

View File

@ -5,7 +5,7 @@ import pynam.util
def g(w, wp):
return ((wp * (w + wp)) + 1) / (csqrt(wp ** 2 - 1) * csqrt((w + wp) ** 2 - 1))
return ((wp * (w + wp)) + 1) / (csqrt(wp**2 - 1) * csqrt((w + wp) ** 2 - 1))
def s(k, e, v):
@ -21,7 +21,7 @@ def f(k, e, v):
def i1(w, wp, k, v):
gv = g(w, wp)
e1 = csqrt((w + wp) ** 2 - 1)
e2 = csqrt(wp ** 2 - 1)
e2 = csqrt(wp**2 - 1)
f_upper = f(k, np.real(e1 - e2), np.imag(e1 + e2) + 2 * v) * (gv + 1)
f_lower = f(k, np.real(-e1 - e2), np.imag(e1 + e2) + 2 * v) * (gv - 1)
@ -32,7 +32,7 @@ def i1(w, wp, k, v):
def i2(w, wp, k, v):
gv = g(w, wp)
e1 = csqrt((w + wp) ** 2 - 1)
e2 = csqrt(wp ** 2 - 1)
e2 = csqrt(wp**2 - 1)
f_upper = f(k, np.real(e1 - e2), np.imag(e1 + e2) + 2 * v) * (gv + 1)
f_lower = f(k, np.real(e1 + e2), np.imag(e1 + e2) + 2 * v) * (gv - 1)
@ -43,21 +43,22 @@ def i2(w, wp, k, v):
def a(w, k, v, t):
result = pynam.util.complex_quad(
lambda wp: np.tanh((w + wp) / (2 * t)) * (i1(w, wp, k, v)),
1 - w, 1,
epsabs=1e-10
1 - w,
1,
epsabs=1e-10,
)
return result[0]
def b_int(wp, w, k, v, t):
return (np.tanh((w + wp) / (2 * t)) * i1(w, wp, k, v)) - (np.tanh(wp / (2 * t)) * i2(w, wp, k, v))
return (np.tanh((w + wp) / (2 * t)) * i1(w, wp, k, v)) - (
np.tanh(wp / (2 * t)) * i2(w, wp, k, v)
)
def b(w, k, v, t, b_max=np.inf):
return pynam.util.complex_quad(
lambda wp: b_int(wp, w, k, v, t), 1, b_max
)[0]
return pynam.util.complex_quad(lambda wp: b_int(wp, w, k, v, t), 1, b_max)[0]
def sigma_nam(w, k, v, t):

View File

@ -10,10 +10,12 @@ def get_chi_zz_e(eps: Callable[[float], complex]) -> Callable[[float], float]:
im_ref_p = pynam.noise.im_ref.get_im_ref_p(eps)
def chi_zz_e(z: float) -> float:
def integrand(y: float) -> float:
return (y**2) * im_ref_p(y / z) * np.exp(-2 * y)
return scipy.integrate.quad(integrand, 0, np.inf, epsabs=1e-10, epsrel=1e-10)[0] / (z**3)
integral = scipy.integrate.quad(
integrand, 0, np.inf, epsabs=1e-10, epsrel=1e-10
)
return integral[0] / (z**3)
return chi_zz_e

View File

@ -6,8 +6,10 @@ import numpy as np
SMALL_X_BOUNDARY = 1e3
def get_zeta_p_integrand(eps: Callable[[float], complex]) -> Callable[[float, float], complex]:
""" Gets the integrand function zeta_p_integrand(u, y).
def get_zeta_p_integrand(
eps: Callable[[float], complex]
) -> Callable[[float, float], complex]:
"""Gets the integrand function zeta_p_integrand(u, y).
Returns zeta_p_integrand(u, y), a complex valued function of two momenta in units of vacuum wavelength.
@ -22,8 +24,8 @@ def get_zeta_p_integrand(eps: Callable[[float], complex]) -> Callable[[float, fl
:param y:
:return:
"""
u2 = u ** 2
y2 = y ** 2
u2 = u**2
y2 = y**2
k2 = u2 + y2
k = np.sqrt(k2)
eps_value = eps(k)
@ -36,36 +38,44 @@ def get_zeta_p_integrand(eps: Callable[[float], complex]) -> Callable[[float, fl
def get_zeta_p_function(eps: Callable[[float], complex]):
def integrand1_small_x(x: float, u: float) -> complex:
u2 = u ** 2
x2 = x ** 2
eps_value = eps(u * np.sqrt(1 + x ** 2))
u2 = u**2
x2 = x**2
eps_value = eps(u * np.sqrt(1 + x**2))
return (x2 / (eps_value - 1 - x2)) / ((1 + x2) * u2)
def integrand1_big_x(x: float, u: float) -> complex:
u2 = u ** 2
x2 = x ** 2
u2 = u**2
x2 = x**2
eps_value = eps(u * x)
return 1 / ((eps_value - x2) * u2)
# 1 / (eps(u * sqrt(1 + x^2))) * 1 / (1 + x^2)
def integrand2_small_x(x: float, u: float) -> complex:
x2 = x ** 2
eps_value = eps(u * np.sqrt(1 + x ** 2))
x2 = x**2
eps_value = eps(u * np.sqrt(1 + x**2))
return 1 / (eps_value * (1 + x2))
def integrand2_big_x(x: float, u: float) -> complex:
x2 = x ** 2
x2 = x**2
eps_value = eps(u * x)
return 1 / (eps_value * x2)
def zeta_p(u: float) -> complex:
zeta_p_integrand = get_zeta_p_integrand(eps)
# zeta_p_integrand = get_zeta_p_integrand(eps)
i1_small = pynam.util.complex_quad(lambda x: integrand1_small_x(x, u), 0, SMALL_X_BOUNDARY, epsabs=1e-12)
i1_big = pynam.util.complex_quad(lambda x: integrand1_big_x(x, u), SMALL_X_BOUNDARY, np.inf, epsabs=1e-12)
i2_small = pynam.util.complex_quad(lambda x: integrand2_small_x(x, u), 0, SMALL_X_BOUNDARY, epsabs=1e-12)
i2_big = pynam.util.complex_quad(lambda x: integrand2_big_x(x, u), SMALL_X_BOUNDARY, np.inf, epsabs=1e-12)
i1_small = pynam.util.complex_quad(
lambda x: integrand1_small_x(x, u), 0, SMALL_X_BOUNDARY, epsabs=1e-12
)
i1_big = pynam.util.complex_quad(
lambda x: integrand1_big_x(x, u), SMALL_X_BOUNDARY, np.inf, epsabs=1e-12
)
i2_small = pynam.util.complex_quad(
lambda x: integrand2_small_x(x, u), 0, SMALL_X_BOUNDARY, epsabs=1e-12
)
i2_big = pynam.util.complex_quad(
lambda x: integrand2_big_x(x, u), SMALL_X_BOUNDARY, np.inf, epsabs=1e-12
)
integral = sum(term[0] for term in [i1_small, i2_small, i1_big, i2_big])

View File

@ -1 +1,3 @@
from pynam.util.complex_integrate import complex_quad, complex_quadrature
__all__ = ["complex_quad", "complex_quadrature"]

View File

@ -3,7 +3,6 @@ from scipy.integrate import quad, quadrature
def complex_quad(func, a, b, **kwargs):
def real_func(x):
return np.real(func(x))
@ -13,11 +12,14 @@ def complex_quad(func, a, b, **kwargs):
real_integral = quad(real_func, a, b, **kwargs)
imag_integral = quad(imag_func, a, b, **kwargs)
return real_integral[0] + 1j * imag_integral[0], real_integral[1:], imag_integral[1:]
return (
real_integral[0] + 1j * imag_integral[0],
real_integral[1:],
imag_integral[1:],
)
def complex_quadrature(func, a, b, **kwargs):
def real_func(x):
return np.real(func(x))
@ -27,4 +29,8 @@ def complex_quadrature(func, a, b, **kwargs):
real_integral = quadrature(real_func, a, b, **kwargs)
imag_integral = quadrature(imag_func, a, b, **kwargs)
return real_integral[0] + 1j * imag_integral[0], real_integral[1:], imag_integral[1:]
return (
real_integral[0] + 1j * imag_integral[0],
real_integral[1:],
imag_integral[1:],
)

View File

@ -1,18 +1,37 @@
[tool.poetry]
name = "pynam"
version = "0.1.1"
description = ""
authors = ["Deepak <dmallubhotla+github@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.7"
numpy = "^1.19"
scipy = "^1.5"
[tool.poetry.dev-dependencies]
pytest = "^3.0"
pytest-benchmark = "^3.2.3"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
[tool.poetry]
name = "pynam"
version = "0.1.1"
description = ""
authors = ["Deepak <dmallubhotla+github@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.8,<3.10"
numpy = "^1.21.1"
scipy = "~1.8"
[tool.poetry.dev-dependencies]
pytest = ">=6"
flake8 = "^4.0.0"
pytest-cov = "^3.0.0"
mypy = "^0.942"
pytest-benchmark = "^3.4.1"
black = "^22.3.0"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "--junitxml pytest.xml --cov pynam --cov-report=xml:coverage.xml --cov-fail-under=50 --cov-report=html"
junit_family = "xunit1"
[tool.mypy]
plugins = "numpy.typing.mypy_plugin"
[[tool.mypy.overrides]]
module = [
"scipy",
"scipy.integrate"
]
ignore_missing_imports = true

3
renovate.json Normal file
View File

@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}

45
scripts/release.sh Normal file
View File

@ -0,0 +1,45 @@
#!/usr/bin/env bash
set -Eeuo pipefail
if [ -z "$(git status --porcelain)" ]; then
branch_name=$(git symbolic-ref -q HEAD)
branch_name=${branch_name##refs/heads/}
branch_name=${branch_name:-HEAD}
if [ $branch_name != "master" ]; then
echo "The current branch is not master!"
echo "I'd feel uncomfortable releasing from here..."
exit 3
fi
release_needed=false
if \
{ git log "$( git describe --tags --abbrev=0 )..HEAD" --format='%s' | cut -d: -f1 | sort -u | sed -e 's/([^)]*)//' | grep -q -i -E '^feat|fix|perf|refactor|revert$' ; } || \
{ git log "$( git describe --tags --abbrev=0 )..HEAD" --format='%s' | cut -d: -f1 | sort -u | sed -e 's/([^)]*)//' | grep -q -E '\!$' ; } || \
{ git log "$( git describe --tags --abbrev=0 )..HEAD" --format='%b' | grep -q -E '^BREAKING CHANGE:' ; }
then
release_needed=true
fi
if ! [ "$release_needed" = true ]; then
echo "No release needed..."
exit 0
fi
# Working directory clean
echo "Doing a dry run..."
npx standard-version --dry-run
read -p "Does that look good? [y/N] " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
# do dangerous stuff
npx standard-version
git push --follow-tags origin master
else
echo "okay, never mind then..."
exit 2
fi
else
echo "Can't create release, working tree unclean..."
exit 1
fi

View File

@ -0,0 +1,11 @@
const pattern = /(\[tool\.poetry\]\nname = "pytest"\nversion = ")(?<vers>\d+\.\d+\.\d)(")/mg;
module.exports.readVersion = function (contents) {
const result = pattern.exec(contents);
return result.groups.vers;
}
module.exports.writeVersion = function (contents, version) {
const newContents = contents.replace(pattern, `$1${version}$3`);
return newContents;
}

View File

@ -9,38 +9,47 @@ def get_common_lindhard_dielectric():
return pynam.dielectric.get_lindhard_dielectric(params)
@pytest.mark.parametrize("test_input,expected", [
(10, -1222.185185062794 + 1.2249999998777178e8j),
(1000, 16924.14814718176 + 1.2250000020552777e8j),
(1e8, 83.687499999706 + 0.00022417398943752126j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
(10, -1222.185185062794 + 1.2249999998777178e8j),
(1000, 16924.14814718176 + 1.2250000020552777e8j),
(1e8, 83.687499999706 + 0.00022417398943752126j),
],
)
def test_lindhard_dielectric(test_input, expected):
eps_to_test = get_common_lindhard_dielectric()
np.testing.assert_almost_equal(
eps_to_test(test_input), expected,
decimal=6, err_msg='b function is off'
eps_to_test(test_input), expected, decimal=6, err_msg="b function is off"
)
@pytest.mark.parametrize("test_input,expected", [
((100, 100), -883.3001542404703 + 1.2566370613549341e8j),
((100, 1e5), 5.827225842825694e7 + 3.933446612656656e7j),
((100, 1e10), 1.0084823001646925 + 2.0013975538629039e-10j),
((100, 1e7), 8483.300121667038 + 0.6340397839154446)
])
@pytest.mark.parametrize(
"test_input,expected",
[
((100, 100), -883.3001542404703 + 1.2566370613549341e8j),
((100, 1e5), 5.827225842825694e7 + 3.933446612656656e7j),
((100, 1e10), 1.0084823001646925 + 2.0013975538629039e-10j),
((100, 1e7), 8483.300121667038 + 0.6340397839154446),
],
)
def test_zeta_pi_lindhard_dielectric(zeta_p_i_epsilon, test_input, expected):
u, y = test_input
actual = zeta_p_i_epsilon(np.sqrt(u**2 + y**2))
np.testing.assert_allclose(
actual, expected,
rtol=10**3.8, err_msg='lindhard dielectric differs from Mathematica'
actual,
expected,
rtol=10**3.8,
err_msg="lindhard dielectric differs from Mathematica",
)
@pytest.fixture
def zeta_p_i_epsilon():
params = CalculationParams(omega=1e9, omega_p=3.544907701811032e15, tau=1e-14, v_f=2e6)
params = CalculationParams(
omega=1e9, omega_p=3.544907701811032e15, tau=1e-14, v_f=2e6
)
return pynam.dielectric.get_lindhard_dielectric(params)

View File

@ -3,101 +3,115 @@ import numpy as np
import pytest
@pytest.mark.parametrize("test_input,expected", [
((1, 2), 7 / (2 * np.sqrt(6))),
((2, 0.25), -5j / np.sqrt(39))
])
@pytest.mark.parametrize(
"test_input,expected",
[((1, 2), 7 / (2 * np.sqrt(6))), ((2, 0.25), -5j / np.sqrt(39))],
)
def test_g(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.low_k_nam.g(*test_input), expected,
decimal=7, err_msg='g function is off'
pynam.dielectric.low_k_nam.g(*test_input),
expected,
decimal=7,
err_msg="g function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((1, 1, 0), 8 / 5),
((1, 1, 1), 3 / 5 + 11j / 15),
((1, 0, 1), 16j / 15)
])
@pytest.mark.parametrize(
"test_input,expected",
[((1, 1, 0), 8 / 5), ((1, 1, 1), 3 / 5 + 11j / 15), ((1, 0, 1), 16j / 15)],
)
def test_f(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.low_k_nam.f(*test_input), expected,
decimal=7, err_msg='f function is off'
pynam.dielectric.low_k_nam.f(*test_input),
expected,
decimal=7,
err_msg="f function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((2, 3, 1, 0), 1.42546694754),
((1, 2, 3, 4), 0.0206212167 + 0.4411134527j)
])
@pytest.mark.parametrize(
"test_input,expected",
[((2, 3, 1, 0), 1.42546694754), ((1, 2, 3, 4), 0.0206212167 + 0.4411134527j)],
)
def test_i1(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.low_k_nam.i1(*test_input), expected,
decimal=7, err_msg='i1 function is off'
pynam.dielectric.low_k_nam.i1(*test_input),
expected,
decimal=7,
err_msg="i1 function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((2, 3, 1, 0), 1.47903168398),
((1, 2, 3, 4), 0.079491440779 + 0.441113452718j)
])
@pytest.mark.parametrize(
"test_input,expected",
[((2, 3, 1, 0), 1.47903168398), ((1, 2, 3, 4), 0.079491440779 + 0.441113452718j)],
)
def test_i2(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.low_k_nam.i2(*test_input), expected,
decimal=7, err_msg='i1 function is off'
pynam.dielectric.low_k_nam.i2(*test_input),
expected,
decimal=7,
err_msg="i1 function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 3, 4), 0.228292),
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 3, 4), 0.228292),
],
)
def test_a(test_input, expected):
actual = np.real_if_close(pynam.dielectric.low_k_nam.a(*test_input))
np.testing.assert_almost_equal(
actual, expected,
decimal=6, err_msg='a function is off'
actual, expected, decimal=6, err_msg="a function is off"
)
@pytest.mark.parametrize("test_input,expected", [
((2, 1, 2, 0, 4), 0.479529593125),
((100, 1, 2, 3, 4), -2.62529549942e-6 + 2.60588e-12j),
])
@pytest.mark.parametrize(
"test_input,expected",
[
((2, 1, 2, 0, 4), 0.479529593125),
((100, 1, 2, 3, 4), -2.62529549942e-6 + 2.60588e-12j),
],
)
def test_b_int(test_input, expected):
actual = np.real_if_close(pynam.dielectric.low_k_nam.b_int(*test_input))
np.testing.assert_almost_equal(
actual, expected,
decimal=6, err_msg='b int function is off'
actual, expected, decimal=6, err_msg="b int function is off"
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 0, 4), 3.514889721181435),
((1, 2, 3, 4), -0.0598057 + 0.437146j),
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 0, 4), 3.514889721181435),
((1, 2, 3, 4), -0.0598057 + 0.437146j),
],
)
def test_b(test_input, expected):
actual = np.real_if_close(pynam.dielectric.low_k_nam.b(*test_input))
np.testing.assert_almost_equal(
actual, expected,
decimal=6, err_msg='b function is off'
actual, expected, decimal=6, err_msg="b function is off"
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 0, 4), 0),
((1, 2, 3, 4), 0.98358 + 0.648221j),
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 0, 4), 0),
((1, 2, 3, 4), 0.98358 + 0.648221j),
],
)
def test_sigma_alk(test_input, expected):
actual = np.real_if_close(pynam.dielectric.low_k_nam.sigma_nam_alk(*test_input))
np.testing.assert_almost_equal(
actual, expected,
decimal=6, err_msg='b function is off'
actual, expected, decimal=6, err_msg="b function is off"
)
def test_sigma_alk_benchmark(benchmark):
result = benchmark(pynam.dielectric.low_k_nam.sigma_nam_alk, 1, 2, 3, 4)
np.testing.assert_almost_equal(
result, 0.98358 + 0.648221j,
decimal=6, err_msg='b function is off'
result, 0.98358 + 0.648221j, decimal=6, err_msg="b function is off"
)

View File

@ -4,102 +4,136 @@ import pynam.dielectric.nam_dielectric_coefficient_approximator
from pynam.baskets import CalculationParams
@pytest.mark.parametrize("test_input,expected", [
# (
# (omega, sigma_n, tau, v_f, T, T_c, c_light),
# (xi, nu, t, A, B)
# )
(
@pytest.mark.parametrize(
"test_input,expected",
[
# (
# (omega, sigma_n, tau, v_f, T, T_c, c_light),
# (xi, nu, t, A, B)
# )
(
(1e9, 1e16, 1e-14, 2e6, 0.8e11, 1e11, 3e8),
(0.007307411691175783, 730.7411691175784, 0.5845929352940626, 0.00004871607794117188, 10000000)
)
])
(
0.007307411691175783,
730.7411691175784,
0.5845929352940626,
0.00004871607794117188,
10000000,
),
)
],
)
def test_dedimensionalise_parameters(test_input, expected):
actual_parameters = pynam.dielectric.nam_dielectric_coefficient_approximator.get_dedimensionalised_parameters(
*test_input)
np.testing.assert_almost_equal(
actual_parameters.xi, expected[0],
decimal=6, err_msg='xi incorrectly calculated'
*test_input
)
np.testing.assert_almost_equal(
actual_parameters.nu, expected[1],
decimal=6, err_msg='nu incorrectly calculated'
actual_parameters.xi,
expected[0],
decimal=6,
err_msg="xi incorrectly calculated",
)
np.testing.assert_almost_equal(
actual_parameters.nu,
expected[1],
decimal=6,
err_msg="nu incorrectly calculated",
)
np.testing.assert_almost_equal(
actual_parameters.t, expected[2],
decimal=6, err_msg='t incorrectly calculated'
actual_parameters.t, expected[2], decimal=6, err_msg="t incorrectly calculated"
)
np.testing.assert_almost_equal(
actual_parameters.a, expected[3],
decimal=6, err_msg='A incorrectly calculated'
actual_parameters.a, expected[3], decimal=6, err_msg="A incorrectly calculated"
)
np.testing.assert_almost_equal(
actual_parameters.b, expected[4],
decimal=6, err_msg='B incorrectly calculated'
actual_parameters.b, expected[4], decimal=6, err_msg="B incorrectly calculated"
)
@pytest.mark.parametrize("test_input,expected", [
# (
# (omega, sigma_n, tau, v_f, T, T_c, c_light),
# (a, b, c, d, u_l)
# )
(
@pytest.mark.parametrize(
"test_input,expected",
[
# (
# (omega, sigma_n, tau, v_f, T, T_c, c_light),
# (a, b, c, d, u_l)
# )
(
(1e9, 1e16, 1e-14, 2e6, 0.8e11, 1e11, 3e8),
(3.789672906817707e10, 3.257134605133221e8, 2.655709897616547e18, 2.15e16, 7.007759408279888e7)
)
])
(
3.789672906817707e10,
3.257134605133221e8,
2.655709897616547e18,
2.15e16,
7.007759408279888e7,
),
)
],
)
def test_nam_coefficients(test_input, expected):
actual_coefficients = pynam.dielectric.nam_dielectric_coefficient_approximator.get_nam_dielectric_coefficients(
*test_input)
np.testing.assert_allclose(
actual_coefficients.a, expected[0],
rtol=1e-6, err_msg='a incorrectly calculated'
*test_input
)
np.testing.assert_allclose(
actual_coefficients.b, expected[1],
rtol=1e-6, err_msg='b incorrectly calculated'
actual_coefficients.a,
expected[0],
rtol=1e-6,
err_msg="a incorrectly calculated",
)
np.testing.assert_allclose(
actual_coefficients.b,
expected[1],
rtol=1e-6,
err_msg="b incorrectly calculated",
)
np.testing.assert_allclose(
actual_coefficients.c, expected[2],
rtol=1e-2, err_msg='c incorrectly calculated'
actual_coefficients.c,
expected[2],
rtol=1e-2,
err_msg="c incorrectly calculated",
)
np.testing.assert_allclose(
actual_coefficients.d, expected[3],
rtol=1e-2, err_msg='d incorrectly calculated'
actual_coefficients.d,
expected[3],
rtol=1e-2,
err_msg="d incorrectly calculated",
)
np.testing.assert_allclose(
actual_coefficients.u_l, expected[4],
rtol=1e-5, err_msg='u_l incorrectly calculated'
actual_coefficients.u_l,
expected[4],
rtol=1e-5,
err_msg="u_l incorrectly calculated",
)
def test_nam_eps():
u_c = 1e15
eps_to_test = pynam.dielectric.nam_dielectric_coefficient_approximator.get_nam_dielectric(u_c, CalculationParams(
omega=1e9,
omega_p=3.54491e15,
tau=1e-14,
v_f=2e6,
t_rel=0.8,
t_c=1e11
))
np.testing.assert_allclose(
eps_to_test(10), -3.789672906817707e10 + 3.257134605133221e8j,
rtol=1e-3, err_msg='below u_l bad'
eps_to_test = (
pynam.dielectric.nam_dielectric_coefficient_approximator.get_nam_dielectric(
u_c,
CalculationParams(
omega=1e9, omega_p=3.54491e15, tau=1e-14, v_f=2e6, t_rel=0.8, t_c=1e11
),
)
)
np.testing.assert_allclose(
eps_to_test(1e10), -2.655709887616547e8 + 2.302290450767144e6j,
rtol=1e-3, err_msg='linear region bad'
eps_to_test(10),
-3.789672906817707e10 + 3.257134605133221e8j,
rtol=1e-3,
err_msg="below u_l bad",
)
np.testing.assert_allclose(
eps_to_test(1e17), 1,
rtol=1e-6, err_msg='above cutoff bad'
eps_to_test(1e10),
-2.655709887616547e8 + 2.302290450767144e6j,
rtol=1e-3,
err_msg="linear region bad",
)
np.testing.assert_allclose(
eps_to_test(1e17), 1, rtol=1e-6, err_msg="above cutoff bad"
)

View File

@ -3,120 +3,163 @@ import numpy as np
import pytest
@pytest.mark.parametrize("test_input,expected", [
((1, 2), 7 / (2 * np.sqrt(6))),
((2, 0.25), -5j / np.sqrt(39))
])
@pytest.mark.parametrize(
"test_input,expected",
[((1, 2), 7 / (2 * np.sqrt(6))), ((2, 0.25), -5j / np.sqrt(39))],
)
def test_g(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.sigma_nam.g(*test_input), expected,
decimal=7, err_msg='g function is off'
pynam.dielectric.sigma_nam.g(*test_input),
expected,
decimal=7,
err_msg="g function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 0), 2),
((1, 2, 3), 2 - 3j),
((1, 0, 3), -3j)
])
@pytest.mark.parametrize(
"test_input,expected", [((1, 2, 0), 2), ((1, 2, 3), 2 - 3j), ((1, 0, 3), -3j)]
)
def test_s(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.sigma_nam.s(*test_input), expected,
decimal=7, err_msg='s function is off'
pynam.dielectric.sigma_nam.s(*test_input),
expected,
decimal=7,
err_msg="s function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 0), 4 - 3 * np.log(3)),
((1, 1, 0.1), 1.7258022209219421 + 0.4146045220413866j),
((1, 2, 1), 0.535971651563 + 0.291580606867j),
((1, 0, 1), (np.pi - 2)*1j),
((2, 1.09637631718, 0), 0.97892512273 + 1.09875591859j),
((2, 1, 0), 0.91197960825 + 1.17809724510j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 0), 4 - 3 * np.log(3)),
((1, 1, 0.1), 1.7258022209219421 + 0.4146045220413866j),
((1, 2, 1), 0.535971651563 + 0.291580606867j),
((1, 0, 1), (np.pi - 2) * 1j),
((2, 1.09637631718, 0), 0.97892512273 + 1.09875591859j),
((2, 1, 0), 0.91197960825 + 1.17809724510j),
],
)
def test_f(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.sigma_nam.f(*test_input), expected,
decimal=7, err_msg='f function is off'
pynam.dielectric.sigma_nam.f(*test_input),
expected,
decimal=7,
err_msg="f function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((2, 3, 1, 0), 1.43292419807),
((1, 2, 3, 4), 0.020963572915 + 0.441546735048j),
((1, 2, 2, 0), 2.24702466263660598724031013350450660504 + 2.6687342075059525776833106878900822165j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
((2, 3, 1, 0), 1.43292419807),
((1, 2, 3, 4), 0.020963572915 + 0.441546735048j),
(
(1, 2, 2, 0),
2.24702466263660598724031013350450660504
+ 2.6687342075059525776833106878900822165j,
),
],
)
def test_i1(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.sigma_nam.i1(*test_input), expected,
decimal=7, err_msg='i1 function is off'
pynam.dielectric.sigma_nam.i1(*test_input),
expected,
decimal=7,
err_msg="i1 function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((2, 3, 1, 0), 1.48649022993),
((1, 2, 3, 4), 0.079899419983 + 0.441546735048j),
((1, 2, 2, 0), 2.5083371377336783093007366990156440969 + 2.6687342075059525776833106878900822165j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
((2, 3, 1, 0), 1.48649022993),
((1, 2, 3, 4), 0.079899419983 + 0.441546735048j),
(
(1, 2, 2, 0),
2.5083371377336783093007366990156440969
+ 2.6687342075059525776833106878900822165j,
),
],
)
def test_i2(test_input, expected):
np.testing.assert_almost_equal(
pynam.dielectric.sigma_nam.i2(*test_input), expected,
decimal=7, err_msg='i1 function is off'
pynam.dielectric.sigma_nam.i2(*test_input),
expected,
decimal=7,
err_msg="i1 function is off",
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 3, 4), 0.228396),
((0.007307411691175783, 1e8, 730.7411691175784, 0.5845929352940626), 1.37272e-7)
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 3, 4), 0.228396),
(
(0.007307411691175783, 1e8, 730.7411691175784, 0.5845929352940626),
1.37272e-7,
),
],
)
def test_a(test_input, expected):
actual = np.real_if_close(pynam.dielectric.sigma_nam.a(*test_input))
np.testing.assert_allclose(
actual, expected,
rtol=1e-5, err_msg='a function is off'
)
np.testing.assert_allclose(actual, expected, rtol=1e-5, err_msg="a function is off")
@pytest.mark.parametrize("test_input,expected", [
((2, 1, 2, 0, 4), 0.19089933550122580816258795500979108668 + 0.30273783507819906415704926284048453889j),
((100, 1, 2, 3, 4), -2.62529549976e-6 + 2.60765e-12j),
])
@pytest.mark.parametrize(
"test_input,expected",
[
(
(2, 1, 2, 0, 4),
0.19089933550122580816258795500979108668
+ 0.30273783507819906415704926284048453889j,
),
((100, 1, 2, 3, 4), -2.62529549976e-6 + 2.60765e-12j),
],
)
def test_b_int(test_input, expected):
actual = np.real_if_close(pynam.dielectric.sigma_nam.b_int(*test_input))
np.testing.assert_almost_equal(
actual, expected,
decimal=6, err_msg='b int function is off'
actual, expected, decimal=6, err_msg="b int function is off"
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 0, 4), 1.23149 + 2.08627j),
((1, 2, 3, 4), -0.0595819 + 0.437385j),
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 0, 4), 1.23149 + 2.08627j),
((1, 2, 3, 4), -0.0595819 + 0.437385j),
],
)
def test_b(test_input, expected):
actual = np.real_if_close(pynam.dielectric.sigma_nam.b(*test_input))
np.testing.assert_almost_equal(
actual, expected,
decimal=6, err_msg='b function is off'
actual, expected, decimal=6, err_msg="b function is off"
)
@pytest.mark.parametrize("test_input,expected", [
((1, 2, 0, 4), 0),
((1, 2, 3, 4), 0.984117 + 0.647951j),
((0.007307411691175783, 1e8, 730.7411691175784, 0.5845929352940626), 0.00008925294700016892 + 0.0102953966846717j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
((1, 2, 0, 4), 0),
((1, 2, 3, 4), 0.984117 + 0.647951j),
(
(0.007307411691175783, 1e8, 730.7411691175784, 0.5845929352940626),
0.00008925294700016892 + 0.0102953966846717j,
),
],
)
def test_sigma_nam(test_input, expected):
actual = np.real_if_close(pynam.dielectric.sigma_nam.sigma_nam(*test_input))
np.testing.assert_allclose(
actual, expected,
rtol=1e-3, err_msg='sigma_nam function is off'
actual, expected, rtol=1e-3, err_msg="sigma_nam function is off"
)
def test_sigma_nam_benchmark(benchmark):
result = benchmark(pynam.dielectric.sigma_nam.sigma_nam, 1, 2, 3, 4)
np.testing.assert_almost_equal(
result, 0.984117 + 0.647951j,
decimal=6, err_msg='sigma nam benchmrak function is off'
result,
0.984117 + 0.647951j,
decimal=6,
err_msg="sigma nam benchmrak function is off",
)

View File

@ -8,34 +8,50 @@ from pynam.baskets import CalculationParams
@pytest.fixture
def chi_zz_e_lindhard():
params = CalculationParams(omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14)
params = CalculationParams(
omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14
)
eps_l = pynam.dielectric.get_lindhard_dielectric(params)
return pynam.noise.chi.get_chi_zz_e(eps_l)
@pytest.mark.parametrize("test_input,expected", [
# z chi_zz_e_lindhard(z)
(1e-5, 4.0249088868003124e6),
(1e-6, 4.400474453780887e9),
(1e-7, 7.768467746685921e12),
(1e-8, 1.8541895525296864e16),
])
@pytest.mark.parametrize(
"test_input,expected",
[
# z chi_zz_e_lindhard(z)
(1e-5, 4.0249088868003124e6),
(1e-6, 4.400474453780887e9),
(1e-7, 7.768467746685921e12),
(1e-8, 1.8541895525296864e16),
],
)
def test_chi_zz_e_lindhard(chi_zz_e_lindhard, test_input, expected):
actual = chi_zz_e_lindhard(test_input)
np.testing.assert_allclose(
actual, expected,
rtol=1e-3, err_msg='chi_zz_e is inaccurate for Lindhard case', verbose=True
actual,
expected,
rtol=1e-3,
err_msg="chi_zz_e is inaccurate for Lindhard case",
verbose=True,
)
@pytest.mark.parametrize("test_input,expected", [
# z chi_zz_e_lindhard(z)
(1e-6, 4.400474453780887e9),
])
def test_chi_zz_e_lindhard_benchmark(benchmark, chi_zz_e_lindhard, test_input, expected):
@pytest.mark.parametrize(
"test_input,expected",
[
# z chi_zz_e_lindhard(z)
(1e-6, 4.400474453780887e9),
],
)
def test_chi_zz_e_lindhard_benchmark(
benchmark, chi_zz_e_lindhard, test_input, expected
):
actual = benchmark(chi_zz_e_lindhard, test_input)
np.testing.assert_allclose(
actual, expected,
rtol=1e-3, err_msg='chi_zz_e is inaccurate for Lindhard case', verbose=True
actual,
expected,
rtol=1e-3,
err_msg="chi_zz_e is inaccurate for Lindhard case",
verbose=True,
)

View File

@ -8,24 +8,32 @@ from pynam.baskets import CalculationParams
@pytest.fixture
def im_ref_p_lindhard():
params = CalculationParams(omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14)
params = CalculationParams(
omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14
)
eps_l = pynam.dielectric.get_lindhard_dielectric(params)
return pynam.noise.im_ref.get_im_ref_p(eps_l)
@pytest.mark.parametrize("test_input,expected", [
# u im_ref_p_l(u)
# needs to be close in range around 1/z, so from 1e4 to 1e8
# (1e4, 1.821722334939806e-8), 1e4 is too far off still
(1e5, 1.602855764970752e-8),
(1e6, 1.704326041013161e-8),
(1e7, 2.674124312031195e-8),
(1e8, 7.441319151047531e-8),
])
@pytest.mark.parametrize(
"test_input,expected",
[
# u im_ref_p_l(u)
# needs to be close in range around 1/z, so from 1e4 to 1e8
# (1e4, 1.821722334939806e-8), 1e4 is too far off still
(1e5, 1.602855764970752e-8),
(1e6, 1.704326041013161e-8),
(1e7, 2.674124312031195e-8),
(1e8, 7.441319151047531e-8),
],
)
def test_im_ref_p_lindhard(im_ref_p_lindhard, test_input, expected):
actual = im_ref_p_lindhard(test_input)
np.testing.assert_allclose(
actual, expected,
rtol=1e-4, err_msg='imrp is inaccurate for Lindhard case', verbose=True
actual,
expected,
rtol=1e-4,
err_msg="imrp is inaccurate for Lindhard case",
verbose=True,
)

View File

@ -8,49 +8,65 @@ from pynam.baskets import CalculationParams
@pytest.fixture
def zeta_p_integrand_lindhard():
params = CalculationParams(omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14)
params = CalculationParams(
omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14
)
eps_l = pynam.dielectric.get_lindhard_dielectric(params)
return pynam.noise.zeta.get_zeta_p_integrand(eps_l)
@pytest.mark.parametrize("test_input,expected", [
# y u zeta_p_i(u, y)
((100, 100), -6.891930153028566e-13 - 7.957747045025948e-9j),
((1e5, 100), -1.0057257267146669e-10 - 4.0591966623027983e-13j),
((100, 1e5), 1.1789175285399862e-8 - 7.957833322596519e-9j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
# y u zeta_p_i(u, y)
((100, 100), -6.891930153028566e-13 - 7.957747045025948e-9j),
((1e5, 100), -1.0057257267146669e-10 - 4.0591966623027983e-13j),
((100, 1e5), 1.1789175285399862e-8 - 7.957833322596519e-9j),
],
)
def test_zeta_p_integrand_lindhard(zeta_p_integrand_lindhard, test_input, expected):
actual = zeta_p_integrand_lindhard(*test_input)
np.testing.assert_allclose(
actual, expected,
rtol=1e-7, err_msg='Zeta_p is inaccurate for Lindhard case', verbose=True
actual,
expected,
rtol=1e-7,
err_msg="Zeta_p is inaccurate for Lindhard case",
verbose=True,
)
@pytest.fixture
def zeta_p_lindhard():
params = CalculationParams(omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14)
params = CalculationParams(
omega=1e9, v_f=2e6, omega_p=3.544907701811032e15, tau=1e-14
)
eps_l = pynam.dielectric.get_lindhard_dielectric(params)
return pynam.noise.zeta.get_zeta_p_function(eps_l)
@pytest.mark.parametrize("test_input,expected", [
# u zeta_p(u)
(1, 0.000199609 - 0.000199608j),
# (10, 0.00019960929309663014 - 0.00019927000998506335j),
# (100, 0.0001996175250684056 - 0.0001654898843938523j),
# (1e3, 0.0002003339895748246 + 0.003212370020888438j),
# (1e4, 0.00028616168676982363 + 0.34096962141224463j),
(1e5, 0.0025183067257958545 + 34.11087430547122j),
(1e6, 0.026829658454640887 + 3411.0870128247902j),
(1e7, 0.4292211181081069 + 341088.797211291j),
(1e8, 14.348462224076096 + 3.391157983312813e7j)
])
@pytest.mark.parametrize(
"test_input,expected",
[
# u zeta_p(u)
(1, 0.000199609 - 0.000199608j),
# (10, 0.00019960929309663014 - 0.00019927000998506335j),
# (100, 0.0001996175250684056 - 0.0001654898843938523j),
# (1e3, 0.0002003339895748246 + 0.003212370020888438j),
# (1e4, 0.00028616168676982363 + 0.34096962141224463j),
(1e5, 0.0025183067257958545 + 34.11087430547122j),
(1e6, 0.026829658454640887 + 3411.0870128247902j),
(1e7, 0.4292211181081069 + 341088.797211291j),
(1e8, 14.348462224076096 + 3.391157983312813e7j),
],
)
def test_zeta_p(zeta_p_lindhard, test_input, expected):
actual = zeta_p_lindhard(test_input)
np.testing.assert_allclose(
actual, expected,
rtol=1e-4, err_msg='Zeta_p is inaccurate for Lindhard case', verbose=True
actual,
expected,
rtol=1e-4,
err_msg="Zeta_p is inaccurate for Lindhard case",
verbose=True,
)

View File

@ -2,4 +2,4 @@ from pynam import __version__
def test_version():
assert __version__ == '0.1.0'
assert __version__ == "0.1.0"

View File

@ -3,18 +3,28 @@ import pynam.util.complex_integrate
def test_complex_quad():
actual = pynam.util.complex_integrate.complex_quad(lambda x: x ** 2 + 1j * x ** 3, 0, 6)[0]
actual = pynam.util.complex_integrate.complex_quad(
lambda x: x**2 + 1j * x**3, 0, 6
)[0]
# int_1^6 dx x^2 + i x^3 should equal (1/3)6^3 + (i/4)6^4
np.testing.assert_almost_equal(
actual, (6**3)/3 + 1j*(6**4)/4,
decimal=7, err_msg='complex quadrature is broken', verbose=True
actual,
(6**3) / 3 + 1j * (6**4) / 4,
decimal=7,
err_msg="complex quadrature is broken",
verbose=True,
)
def test_complex_quadrature():
actual = pynam.util.complex_integrate.complex_quadrature(lambda x: x ** 2 + 1j * x ** 3, 0, 6)[0]
actual = pynam.util.complex_integrate.complex_quadrature(
lambda x: x**2 + 1j * x**3, 0, 6
)[0]
# int_1^6 dx x^2 + i x^3 should equal (1/3)6^3 + (i/4)6^4
np.testing.assert_almost_equal(
actual, (6**3)/3 + 1j*(6**4)/4,
decimal=7, err_msg='complex quadrature is broken', verbose=True
actual,
(6**3) / 3 + 1j * (6**4) / 4,
decimal=7,
err_msg="complex quadrature is broken",
verbose=True,
)