kineticheck 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kineticheck-0.1.0/.github/ISSUE_TEMPLATE/bug.yml +21 -0
- kineticheck-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- kineticheck-0.1.0/.github/ISSUE_TEMPLATE/dataset.yml +26 -0
- kineticheck-0.1.0/.github/ISSUE_TEMPLATE/feature.yml +17 -0
- kineticheck-0.1.0/.github/ISSUE_TEMPLATE/macos.yml +34 -0
- kineticheck-0.1.0/.github/ISSUE_TEMPLATE/scientific.yml +20 -0
- kineticheck-0.1.0/.github/dependabot.yml +10 -0
- kineticheck-0.1.0/.github/workflows/ci.yml +88 -0
- kineticheck-0.1.0/.github/workflows/macos.yml +70 -0
- kineticheck-0.1.0/.github/workflows/publish.yml +60 -0
- kineticheck-0.1.0/.gitignore +11 -0
- kineticheck-0.1.0/CHANGELOG.md +11 -0
- kineticheck-0.1.0/CITATION.cff +15 -0
- kineticheck-0.1.0/CONTRIBUTING.md +24 -0
- kineticheck-0.1.0/LICENSE +28 -0
- kineticheck-0.1.0/PKG-INFO +155 -0
- kineticheck-0.1.0/README.md +113 -0
- kineticheck-0.1.0/docs/assets/social-preview.png +0 -0
- kineticheck-0.1.0/docs/assets/transport-envelope.svg +1274 -0
- kineticheck-0.1.0/docs/batch-schema.md +34 -0
- kineticheck-0.1.0/docs/macos.md +40 -0
- kineticheck-0.1.0/docs/naming-audit.md +48 -0
- kineticheck-0.1.0/docs/scientific-basis.md +65 -0
- kineticheck-0.1.0/docs/validation.md +36 -0
- kineticheck-0.1.0/examples/operating_point.json +33 -0
- kineticheck-0.1.0/examples/operating_points.csv +4 -0
- kineticheck-0.1.0/pyproject.toml +109 -0
- kineticheck-0.1.0/src/kineticheck/__init__.py +31 -0
- kineticheck-0.1.0/src/kineticheck/__main__.py +3 -0
- kineticheck-0.1.0/src/kineticheck/application.py +188 -0
- kineticheck-0.1.0/src/kineticheck/cli.py +101 -0
- kineticheck-0.1.0/src/kineticheck/core/__init__.py +21 -0
- kineticheck-0.1.0/src/kineticheck/core/criteria.py +233 -0
- kineticheck-0.1.0/src/kineticheck/gui/__init__.py +27 -0
- kineticheck-0.1.0/src/kineticheck/gui/__main__.py +3 -0
- kineticheck-0.1.0/src/kineticheck/gui/app.py +260 -0
- kineticheck-0.1.0/src/kineticheck/io/__init__.py +5 -0
- kineticheck-0.1.0/src/kineticheck/io/tabular.py +194 -0
- kineticheck-0.1.0/src/kineticheck/models.py +87 -0
- kineticheck-0.1.0/src/kineticheck/plotting.py +51 -0
- kineticheck-0.1.0/src/kineticheck/units.py +82 -0
- kineticheck-0.1.0/tests/test_core.py +71 -0
- kineticheck-0.1.0/tests/test_gui.py +40 -0
- kineticheck-0.1.0/tests/test_io_cli.py +102 -0
- kineticheck-0.1.0/tests/test_project_policy.py +41 -0
- kineticheck-0.1.0/tests/test_units_application.py +80 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible software defect.
|
|
3
|
+
title: "[Bug] "
|
|
4
|
+
labels: [bug]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: "Do not attach unpublished or confidential research data. Create a minimal synthetic reproducer."
|
|
9
|
+
- type: textarea
|
|
10
|
+
id: reproduce
|
|
11
|
+
attributes:
|
|
12
|
+
label: Reproduction
|
|
13
|
+
description: Commands, minimal inputs, expected result, and actual result.
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: input
|
|
17
|
+
id: version
|
|
18
|
+
attributes:
|
|
19
|
+
label: KinetiCheck and Python versions
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: Real dataset compatibility
|
|
2
|
+
description: Propose a public, licensed dataset or report an import issue.
|
|
3
|
+
title: "[Dataset] "
|
|
4
|
+
labels: [dataset]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: "Only public data may be linked. Never upload unpublished or confidential laboratory data."
|
|
9
|
+
- type: input
|
|
10
|
+
id: doi
|
|
11
|
+
attributes:
|
|
12
|
+
label: DOI or persistent public URL
|
|
13
|
+
validations:
|
|
14
|
+
required: true
|
|
15
|
+
- type: input
|
|
16
|
+
id: license
|
|
17
|
+
attributes:
|
|
18
|
+
label: Dataset license
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: scope
|
|
23
|
+
attributes:
|
|
24
|
+
label: Files, checksum, and intended validation scope
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose one bounded research workflow.
|
|
3
|
+
title: "[Feature] "
|
|
4
|
+
labels: [enhancement]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: need
|
|
8
|
+
attributes:
|
|
9
|
+
label: Research decision and current limitation
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: evidence
|
|
14
|
+
attributes:
|
|
15
|
+
label: Scientific definition, validity range, and authoritative source
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: macOS or GUI issue
|
|
2
|
+
description: Report installation, Tk, window lifecycle, export, or backend failure.
|
|
3
|
+
title: "[macOS/GUI] "
|
|
4
|
+
labels: [macos, gui]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: "Do not attach confidential data. Include the complete traceback as text."
|
|
9
|
+
- type: input
|
|
10
|
+
id: macos
|
|
11
|
+
attributes:
|
|
12
|
+
label: macOS version and architecture
|
|
13
|
+
placeholder: macOS 15.x, Apple Silicon or Intel
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: input
|
|
17
|
+
id: versions
|
|
18
|
+
attributes:
|
|
19
|
+
label: Python, KinetiCheck, Tk, and matplotlib versions
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: install
|
|
24
|
+
attributes:
|
|
25
|
+
label: Installation method and exact GUI command
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: traceback
|
|
30
|
+
attributes:
|
|
31
|
+
label: Complete traceback
|
|
32
|
+
render: shell
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: Scientific result question
|
|
2
|
+
description: Ask about an equation, definition, unit, threshold, or interpretation.
|
|
3
|
+
title: "[Science] "
|
|
4
|
+
labels: [scientific-question]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: "Do not post unpublished/confidential data. State the exact rate basis and cite the proposed definition."
|
|
9
|
+
- type: textarea
|
|
10
|
+
id: definition
|
|
11
|
+
attributes:
|
|
12
|
+
label: Equation, convention, and reference
|
|
13
|
+
validations:
|
|
14
|
+
required: true
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: inputs
|
|
17
|
+
attributes:
|
|
18
|
+
label: Minimal synthetic inputs with units and rate basis
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
name: DGX CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: kineticheck-dgx-${{ github.event.pull_request.number || github.ref }}
|
|
15
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
scientific:
|
|
19
|
+
name: DGX / scientific, package, CLI, GUI
|
|
20
|
+
# Public fork PR code must never execute on the persistent DGX host.
|
|
21
|
+
if: >-
|
|
22
|
+
github.event_name != 'pull_request' ||
|
|
23
|
+
(github.actor == github.repository_owner &&
|
|
24
|
+
github.event.pull_request.head.repo.full_name == github.repository)
|
|
25
|
+
runs-on: [self-hosted, Linux, ARM64, dgx-spark]
|
|
26
|
+
timeout-minutes: 35
|
|
27
|
+
env:
|
|
28
|
+
PIP_NO_CACHE_DIR: "1"
|
|
29
|
+
PYTHONNOUSERSITE: "1"
|
|
30
|
+
steps:
|
|
31
|
+
- name: Check out reviewed source
|
|
32
|
+
uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.0.0
|
|
33
|
+
with:
|
|
34
|
+
clean: true
|
|
35
|
+
persist-credentials: false
|
|
36
|
+
- name: Set up Python
|
|
37
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.0.0
|
|
38
|
+
with:
|
|
39
|
+
python-version: "3.12"
|
|
40
|
+
- name: Activate the verified DGX Tk and Xvfb runtime
|
|
41
|
+
shell: bash
|
|
42
|
+
run: |
|
|
43
|
+
set -euo pipefail
|
|
44
|
+
runtime=/opt/catalysttwin-actions/shared-gui-runtime
|
|
45
|
+
test -x "$runtime/usr/bin/Xvfb"
|
|
46
|
+
test -x "$runtime/usr/bin/xvfb-run"
|
|
47
|
+
test -f "$runtime/usr/lib/aarch64-linux-gnu/libtk8.6.so"
|
|
48
|
+
test -d "$runtime/usr/share/tcltk/tk8.6"
|
|
49
|
+
echo "$runtime/usr/bin" >> "$GITHUB_PATH"
|
|
50
|
+
echo "LD_LIBRARY_PATH=$runtime/usr/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH:-}" >> "$GITHUB_ENV"
|
|
51
|
+
echo "TK_LIBRARY=$runtime/usr/share/tcltk/tk8.6" >> "$GITHUB_ENV"
|
|
52
|
+
- name: Install project and validation tools
|
|
53
|
+
run: |
|
|
54
|
+
python -m pip install --upgrade pip
|
|
55
|
+
python -m pip install -e ".[dev]"
|
|
56
|
+
- name: Ruff format
|
|
57
|
+
run: python -m ruff format --check .
|
|
58
|
+
- name: Ruff lint
|
|
59
|
+
run: python -m ruff check .
|
|
60
|
+
- name: Strict typing
|
|
61
|
+
run: python -m mypy
|
|
62
|
+
- name: Unit, regression, integration, GUI, and import-isolation tests
|
|
63
|
+
run: xvfb-run -a python -m pytest
|
|
64
|
+
- name: Scientific and example CLI smoke
|
|
65
|
+
run: |
|
|
66
|
+
kineticheck validate
|
|
67
|
+
kineticheck evaluate examples/operating_point.json --output "$RUNNER_TEMP/kineticheck-point.json"
|
|
68
|
+
kineticheck batch examples/operating_points.csv --output "$RUNNER_TEMP/kineticheck-batch.xlsx"
|
|
69
|
+
kineticheck plot examples/operating_points.csv --criterion C_WP --output "$RUNNER_TEMP/kineticheck-envelope.svg"
|
|
70
|
+
- name: Tk GUI workflow under Xvfb
|
|
71
|
+
run: xvfb-run -a python -m kineticheck.gui --smoke-test
|
|
72
|
+
- name: Build and metadata check
|
|
73
|
+
run: |
|
|
74
|
+
python -m build
|
|
75
|
+
python -m twine check dist/*
|
|
76
|
+
- name: Clean-wheel installation, CLI, GUI, and pip check
|
|
77
|
+
shell: bash
|
|
78
|
+
run: |
|
|
79
|
+
set -euo pipefail
|
|
80
|
+
wheel="$(find dist -maxdepth 1 -name '*.whl' -print -quit)"
|
|
81
|
+
clean_env="$RUNNER_TEMP/kineticheck-clean-wheel"
|
|
82
|
+
python -m venv "$clean_env"
|
|
83
|
+
"$clean_env/bin/python" -m pip install --no-cache-dir "$wheel"
|
|
84
|
+
"$clean_env/bin/python" -m pip check
|
|
85
|
+
"$clean_env/bin/kineticheck" validate
|
|
86
|
+
xvfb-run -a "$clean_env/bin/python" -m kineticheck.gui --smoke-test
|
|
87
|
+
- name: Dependency audit
|
|
88
|
+
run: python -m pip_audit
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: macOS GUI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: kineticheck-macos-${{ github.event.pull_request.number || github.ref }}
|
|
15
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
gui:
|
|
19
|
+
name: macOS / Tk workflow and clean wheel
|
|
20
|
+
# Apply the same public-fork trust boundary used for the persistent runner.
|
|
21
|
+
if: >-
|
|
22
|
+
github.event_name != 'pull_request' ||
|
|
23
|
+
(github.actor == github.repository_owner &&
|
|
24
|
+
github.event.pull_request.head.repo.full_name == github.repository)
|
|
25
|
+
runs-on: macos-15
|
|
26
|
+
timeout-minutes: 25
|
|
27
|
+
env:
|
|
28
|
+
PIP_NO_CACHE_DIR: "1"
|
|
29
|
+
PYTHONNOUSERSITE: "1"
|
|
30
|
+
steps:
|
|
31
|
+
- name: Check out source
|
|
32
|
+
uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.0.0
|
|
33
|
+
with:
|
|
34
|
+
clean: true
|
|
35
|
+
persist-credentials: false
|
|
36
|
+
- name: Set up Python
|
|
37
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.0.0
|
|
38
|
+
with:
|
|
39
|
+
python-version: "3.12"
|
|
40
|
+
- name: Record platform
|
|
41
|
+
run: |
|
|
42
|
+
sw_vers
|
|
43
|
+
uname -m
|
|
44
|
+
python --version
|
|
45
|
+
- name: Install source with GUI and plotting checks
|
|
46
|
+
run: |
|
|
47
|
+
python -m pip install --upgrade pip
|
|
48
|
+
python -m pip install -e ".[dev]"
|
|
49
|
+
- name: Focused scientific and CLI smoke
|
|
50
|
+
run: |
|
|
51
|
+
python -m pytest --no-cov tests/test_core.py tests/test_units_application.py tests/test_gui.py
|
|
52
|
+
kineticheck validate
|
|
53
|
+
kineticheck evaluate examples/operating_point.json --output "$RUNNER_TEMP/point.json"
|
|
54
|
+
- name: GUI import, workflow, export, close, and process exit
|
|
55
|
+
run: python -m kineticheck.gui --smoke-test
|
|
56
|
+
- name: Agg backend isolation smoke
|
|
57
|
+
run: kineticheck plot examples/operating_points.csv --output "$RUNNER_TEMP/envelope.pdf"
|
|
58
|
+
- name: Build and clean-wheel smoke
|
|
59
|
+
shell: bash
|
|
60
|
+
run: |
|
|
61
|
+
set -euo pipefail
|
|
62
|
+
python -m build
|
|
63
|
+
wheel="$(find dist -maxdepth 1 -name '*.whl' -print -quit)"
|
|
64
|
+
clean_env="$RUNNER_TEMP/kineticheck-macos-wheel"
|
|
65
|
+
python -m venv "$clean_env"
|
|
66
|
+
"$clean_env/bin/python" -m pip install --no-cache-dir "$wheel"
|
|
67
|
+
"$clean_env/bin/python" -m pip check
|
|
68
|
+
"$clean_env/bin/kineticheck" validate
|
|
69
|
+
"$clean_env/bin/python" -m kineticheck.gui --smoke-test
|
|
70
|
+
"$clean_env/bin/python" -c "import sys, kineticheck; assert not any(n.startswith(('PyQt', 'PySide')) for n in sys.modules)"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*.*.*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build immutable distributions
|
|
13
|
+
if: github.repository == 'hdkim99/KinetiCheck'
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
timeout-minutes: 15
|
|
16
|
+
steps:
|
|
17
|
+
- name: Check out tagged source
|
|
18
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
19
|
+
with:
|
|
20
|
+
persist-credentials: false
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
- name: Validate tag and build
|
|
27
|
+
shell: bash
|
|
28
|
+
run: |
|
|
29
|
+
set -euo pipefail
|
|
30
|
+
version="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')"
|
|
31
|
+
test "$GITHUB_REF_NAME" = "v$version"
|
|
32
|
+
python -m pip install build==1.5.0 twine
|
|
33
|
+
python -m build
|
|
34
|
+
python -m twine check dist/*
|
|
35
|
+
- name: Upload distributions
|
|
36
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
37
|
+
with:
|
|
38
|
+
name: kineticheck-distributions-${{ github.run_id }}
|
|
39
|
+
path: dist/
|
|
40
|
+
if-no-files-found: error
|
|
41
|
+
retention-days: 7
|
|
42
|
+
|
|
43
|
+
publish:
|
|
44
|
+
name: Trusted Publishing
|
|
45
|
+
needs: build
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
timeout-minutes: 10
|
|
48
|
+
environment:
|
|
49
|
+
name: pypi
|
|
50
|
+
url: https://pypi.org/project/kineticheck/
|
|
51
|
+
permissions:
|
|
52
|
+
id-token: write
|
|
53
|
+
steps:
|
|
54
|
+
- name: Download immutable distributions
|
|
55
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.0
|
|
56
|
+
with:
|
|
57
|
+
name: kineticheck-distributions-${{ github.run_id }}
|
|
58
|
+
path: dist/
|
|
59
|
+
- name: Publish with OIDC
|
|
60
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes follow [Keep a Changelog](https://keepachangelog.com/) and semantic versioning.
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.1.0] - pending
|
|
8
|
+
|
|
9
|
+
- Initial four-criterion scientific core with explicit units and rate basis.
|
|
10
|
+
- JSON API/CLI, CSV/XLSX batch workflow, figure export, and Tkinter GUI.
|
|
11
|
+
- Hand, literature-point, packaging, import-isolation, Linux/DGX, and macOS validation infrastructure.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use KinetiCheck, please cite the software and the original criterion publications."
|
|
3
|
+
title: "KinetiCheck"
|
|
4
|
+
type: software
|
|
5
|
+
authors:
|
|
6
|
+
- family-names: "Kim"
|
|
7
|
+
given-names: "Peter"
|
|
8
|
+
repository-code: "https://github.com/hdkim99/KinetiCheck"
|
|
9
|
+
url: "https://github.com/hdkim99/KinetiCheck"
|
|
10
|
+
version: 0.1.0
|
|
11
|
+
license: BSD-3-Clause
|
|
12
|
+
keywords:
|
|
13
|
+
- heterogeneous catalysis
|
|
14
|
+
- reaction engineering
|
|
15
|
+
- transport limitations
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Please use a focused issue or pull request and do not upload unpublished or confidential research
|
|
4
|
+
data to a public issue.
|
|
5
|
+
|
|
6
|
+
A scientific-core change must state the equation or definition, units and rate basis, assumptions,
|
|
7
|
+
validity range, authoritative reference, numerical hand check, boundary/invalid-input behavior, and a
|
|
8
|
+
regression test. Matching a paper's rounded result is not a reason to change a definition silently.
|
|
9
|
+
|
|
10
|
+
A GUI change must state supported platforms, dependency and backend impact, macOS smoke result, and
|
|
11
|
+
whether CLI/core import isolation remains intact. GUI settings must reach the application service;
|
|
12
|
+
formulas must not be copied into widgets.
|
|
13
|
+
|
|
14
|
+
Before submitting:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
python -m pip install -e ".[dev]"
|
|
18
|
+
python -m ruff format --check .
|
|
19
|
+
python -m ruff check .
|
|
20
|
+
python -m mypy
|
|
21
|
+
python -m pytest
|
|
22
|
+
python -m build
|
|
23
|
+
python -m twine check dist/*
|
|
24
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, Peter Kim
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kineticheck
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Explicit transport-limitation screening for heterogeneous catalytic kinetics.
|
|
5
|
+
Project-URL: Homepage, https://github.com/hdkim99/KinetiCheck
|
|
6
|
+
Project-URL: Documentation, https://github.com/hdkim99/KinetiCheck#readme
|
|
7
|
+
Project-URL: Issues, https://github.com/hdkim99/KinetiCheck/issues
|
|
8
|
+
Project-URL: Repository, https://github.com/hdkim99/KinetiCheck
|
|
9
|
+
Author: Peter Kim
|
|
10
|
+
License-Expression: BSD-3-Clause
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: catalysis,kinetics,mass-transfer,reaction-engineering
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
25
|
+
Requires-Python: <3.15,>=3.10
|
|
26
|
+
Requires-Dist: openpyxl<4,>=3.1.5
|
|
27
|
+
Requires-Dist: pint<0.26,>=0.24.4
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: build==1.5.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: matplotlib<4,>=3.9; extra == 'dev'
|
|
31
|
+
Requires-Dist: mypy<2,>=1.14; extra == 'dev'
|
|
32
|
+
Requires-Dist: pip-audit<3,>=2.9; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-cov<8,>=6; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest<10,>=8.3; extra == 'dev'
|
|
35
|
+
Requires-Dist: ruff<0.17,>=0.9; extra == 'dev'
|
|
36
|
+
Requires-Dist: twine<7,>=6; extra == 'dev'
|
|
37
|
+
Requires-Dist: types-openpyxl<4,>=3.1.5; extra == 'dev'
|
|
38
|
+
Provides-Extra: gui
|
|
39
|
+
Provides-Extra: plot
|
|
40
|
+
Requires-Dist: matplotlib<4,>=3.9; extra == 'plot'
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
|
|
43
|
+
# KinetiCheck
|
|
44
|
+
|
|
45
|
+
**Explicit transport-limitation screening for heterogeneous catalytic kinetics.**
|
|
46
|
+
|
|
47
|
+
[](https://github.com/hdkim99/KinetiCheck/actions/workflows/ci.yml)
|
|
48
|
+
[](https://github.com/hdkim99/KinetiCheck/actions/workflows/macos.yml)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+
|
|
51
|
+

|
|
52
|
+
|
|
53
|
+
KinetiCheck answers a deliberately limited question: *do the selected classical criteria detect a
|
|
54
|
+
significant internal/external heat- or mass-transfer limitation under the stated properties and
|
|
55
|
+
assumptions?* A passing screen is not proof of intrinsic kinetics.
|
|
56
|
+
|
|
57
|
+
## Why
|
|
58
|
+
|
|
59
|
+
Published checks often hide whether a rate was per catalyst mass, pellet volume, or bed volume;
|
|
60
|
+
whether diameter or radius was used; and whether a bulk concentration stood in for the pellet-surface
|
|
61
|
+
concentration. KinetiCheck makes those choices machine-readable and includes them in the export.
|
|
62
|
+
|
|
63
|
+
## Install
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python -m venv .venv
|
|
67
|
+
source .venv/bin/activate
|
|
68
|
+
python -m pip install kineticheck
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Until the first PyPI release, install from source with `python -m pip install .`. Plot export is optional:
|
|
72
|
+
`python -m pip install "kineticheck[plot]"`. The Tkinter GUI has no third-party GUI dependency, but the
|
|
73
|
+
Python installation must include Tk.
|
|
74
|
+
|
|
75
|
+
## 30-second example
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
kineticheck evaluate examples/operating_point.json
|
|
79
|
+
kineticheck batch examples/operating_points.csv --output results.xlsx
|
|
80
|
+
kineticheck plot examples/operating_points.csv --criterion C_WP --output envelope.svg
|
|
81
|
+
python -m kineticheck.gui
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The included example gives `C_WP = 0.02`, `C_MM = 0.01`, `C_MH ≈ 0.02138`, and
|
|
85
|
+
`C_AH ≈ 0.01069`. Its inputs are pedagogical, not a real catalyst dataset.
|
|
86
|
+
|
|
87
|
+
## Scientific basis
|
|
88
|
+
|
|
89
|
+
| Screen | Implemented dimensionless form | Default comparison |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| Weisz–Prater internal mass | `C_WP = abs(r_obs,V) R_p² / (D_eff C_A,s)` | `C_WP < 0.30` |
|
|
92
|
+
| Mears external mass | `C_MM = abs(r_obs,V) R_p abs(n) / (k_c C_A,b)` | `C_MM < 0.15` |
|
|
93
|
+
| Mears external heat | `C_MH = abs(ΔH_r) abs(r_obs,V) R_p E_a / (h R_g T_b²)` | `C_MH < 0.15` |
|
|
94
|
+
| Anderson internal heat | `C_AH = abs(ΔH_r) abs(r_obs,V) R_p² E_a / (λ_eff R_g T_s²)` | `C_AH < 0.75` |
|
|
95
|
+
|
|
96
|
+
Each result records its equation, reference, assumptions, threshold, and convention. Thresholds may
|
|
97
|
+
be overridden explicitly. The detailed discussion in [Scientific definitions](docs/scientific-basis.md)
|
|
98
|
+
documents formulation differences rather than presenting a threshold as universal.
|
|
99
|
+
|
|
100
|
+
## Rate basis and units
|
|
101
|
+
|
|
102
|
+
Pint distinguishes, among others, `mol kgcat^-1 s^-1`, `mol gcat^-1 h^-1`, and
|
|
103
|
+
`mol m^-3 s^-1`, as well as `m`, `mm`, `µm`, `Pa`, `bar`, `J mol^-1`, and `kJ mol^-1`.
|
|
104
|
+
Mass-catalyst rates require an apparent pellet density. Bed-volume rates require a bed void fraction.
|
|
105
|
+
No implicit conversion between those bases is allowed.
|
|
106
|
+
|
|
107
|
+
## Validation
|
|
108
|
+
|
|
109
|
+
- Four-criterion hand calculation with exact intermediate values.
|
|
110
|
+
- Boundary, invalid physical input, mixed-unit, rate-basis, batch CSV/XLSX, CLI, export, and GUI
|
|
111
|
+
lifecycle tests.
|
|
112
|
+
- Independent reproduction of the `3.910e-5` Mears external-mass value reported in the electronic
|
|
113
|
+
supplement to RSC article `C5CY00934K`.
|
|
114
|
+
|
|
115
|
+
No suitably licensed full public operating-point dataset has yet been adopted; **real-data dataset
|
|
116
|
+
validation is pending**. The literature-point reproduction is not described as dataset validation.
|
|
117
|
+
See [validation](docs/validation.md).
|
|
118
|
+
|
|
119
|
+
## GUI and supported platforms
|
|
120
|
+
|
|
121
|
+
The GUI uses standard-library Tkinter/ttk. Qt, PyQt, PySide, and PyQtGraph are not dependencies.
|
|
122
|
+
The core/CLI import path does not import Tkinter or matplotlib. Matplotlib is imported only by the
|
|
123
|
+
plot command and uses `Agg`; the Tk GUI currently displays tabular results and therefore does not
|
|
124
|
+
select a matplotlib GUI backend.
|
|
125
|
+
|
|
126
|
+
- Python package metadata: 3.10–3.14; GUI smoke verified on Python 3.12 and 3.14
|
|
127
|
+
- Linux: scientific CI on the repository DGX ARM64 runner
|
|
128
|
+
- macOS: 15.7.7 hosted and 27.0 local, both on Apple Silicon; older versions are not yet verified
|
|
129
|
+
- Architectures: ARM64 is tested; Intel macOS remains not verified
|
|
130
|
+
|
|
131
|
+
Run `python -m kineticheck.gui --smoke-test` to exercise window creation, core calculation, JSON
|
|
132
|
+
export, close, and process exit. See [macOS notes](docs/macos.md).
|
|
133
|
+
|
|
134
|
+
## Limitations
|
|
135
|
+
|
|
136
|
+
- KinetiCheck screens supplied properties; it does not estimate diffusivity, transfer coefficients,
|
|
137
|
+
conductivity, or reaction order with unreviewed correlations.
|
|
138
|
+
- Classical local criteria do not replace particle-size/flow-rate experiments, detailed pellet
|
|
139
|
+
models, reactor energy balances, or uncertainty analysis.
|
|
140
|
+
- A bulk concentration may only stand in for `C_A,s` when the researcher explicitly accepts that
|
|
141
|
+
assumption.
|
|
142
|
+
- Complex rate laws, strong product inhibition, multiphase wetting, non-spherical characteristic
|
|
143
|
+
lengths, and coupled runaway behavior can lie outside the implemented screens.
|
|
144
|
+
- No confidence interval is fabricated from deterministic criteria.
|
|
145
|
+
|
|
146
|
+
## Documentation
|
|
147
|
+
|
|
148
|
+
- [Scientific definitions and references](docs/scientific-basis.md)
|
|
149
|
+
- [Batch schema](docs/batch-schema.md)
|
|
150
|
+
- [Validation record](docs/validation.md)
|
|
151
|
+
- [Naming and competitive audit](docs/naming-audit.md)
|
|
152
|
+
- [macOS and GUI policy](docs/macos.md)
|
|
153
|
+
- [Contributing](CONTRIBUTING.md)
|
|
154
|
+
|
|
155
|
+
KinetiCheck is research decision-support software, not process-safety certification software.
|