reactorcheck 0.2.0__tar.gz → 0.2.2__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.
Files changed (55) hide show
  1. reactorcheck-0.2.2/.github/workflows/ci.yml +164 -0
  2. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/.github/workflows/release.yml +5 -5
  3. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/.gitignore +1 -0
  4. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/CHANGELOG.md +26 -3
  5. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/CITATION.cff +2 -1
  6. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/CONTRIBUTING.md +8 -0
  7. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/PKG-INFO +30 -16
  8. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/README.md +29 -15
  9. reactorcheck-0.2.2/docs/public-data-sources.md +249 -0
  10. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/pyproject.toml +1 -1
  11. reactorcheck-0.2.2/scripts/validate_public_reactor_data.py +280 -0
  12. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/__init__.py +1 -1
  13. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/io.py +73 -1
  14. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/species.py +7 -1
  15. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/gui_widget_smoke.py +24 -4
  16. reactorcheck-0.2.2/tests/test_project_metadata.py +60 -0
  17. reactorcheck-0.2.2/tests/test_public_data_regressions.py +191 -0
  18. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_version.py +1 -1
  19. reactorcheck-0.2.0/.github/workflows/ci.yml +0 -72
  20. reactorcheck-0.2.0/tests/test_project_metadata.py +0 -30
  21. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/LICENSE +0 -0
  22. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/docs/assets/composition-result.png +0 -0
  23. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/docs/assets/example-result.png +0 -0
  24. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/docs/assets/social-preview.png +0 -0
  25. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/docs/dependency-licenses.md +0 -0
  26. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/docs/interchange.md +0 -0
  27. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/docs/scientific-definitions.md +0 -0
  28. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/examples/synthetic_composition.csv +0 -0
  29. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/examples/synthetic_composition.xlsx +0 -0
  30. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/examples/synthetic_composition_config.json +0 -0
  31. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/examples/synthetic_config.json +0 -0
  32. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/examples/synthetic_reactor.csv +0 -0
  33. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/schemas/reactorcheck-interchange.experimental.schema.json +0 -0
  34. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/scripts/generate_example_assets.py +0 -0
  35. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/__main__.py +0 -0
  36. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/calculations.py +0 -0
  37. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/cli.py +0 -0
  38. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/composition.py +0 -0
  39. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/gui.py +0 -0
  40. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/gui_controller.py +0 -0
  41. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/models.py +0 -0
  42. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/plotting.py +0 -0
  43. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/py.typed +0 -0
  44. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/qc.py +0 -0
  45. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/service.py +0 -0
  46. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/steady.py +0 -0
  47. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/src/reactorcheck/units.py +0 -0
  48. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/conftest.py +0 -0
  49. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_calculations.py +0 -0
  50. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_composition.py +0 -0
  51. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_io_cli_gui.py +0 -0
  52. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_service.py +0 -0
  53. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_species.py +0 -0
  54. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_steady.py +0 -0
  55. {reactorcheck-0.2.0 → reactorcheck-0.2.2}/tests/test_units.py +0 -0
@@ -0,0 +1,164 @@
1
+ name: 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: reactorcheck-ci-${{ github.event.pull_request.number || github.ref }}
15
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
16
+
17
+ jobs:
18
+ required:
19
+ name: CI / required
20
+ # Public fork code must never execute on persistent self-hosted research hardware.
21
+ if: >-
22
+ github.event_name != 'pull_request' ||
23
+ github.event.pull_request.head.repo.full_name == github.repository
24
+ runs-on: [self-hosted, dgx-spark]
25
+ timeout-minutes: 60
26
+ env:
27
+ PIP_NO_CACHE_DIR: "1"
28
+ REACTORCHECK_CI_VENV: reactorcheck-ci-${{ github.run_id }}-${{ github.run_attempt }}
29
+ REACTORCHECK_WHEEL_VENV: reactorcheck-wheel-${{ github.run_id }}-${{ github.run_attempt }}
30
+ REACTORCHECK_CI_OUTPUT: reactorcheck-output-${{ github.run_id }}-${{ github.run_attempt }}
31
+ steps:
32
+ - name: Check out source
33
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
34
+ with:
35
+ clean: true
36
+ fetch-depth: 0
37
+ persist-credentials: false
38
+ - name: Set up Python
39
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
40
+ with:
41
+ python-version: "3.13"
42
+ - name: Configure shared Tk and Xvfb runtime
43
+ env:
44
+ REACTORCHECK_GUI_RUNTIME: /opt/catalysttwin-actions/shared-gui-runtime
45
+ run: |
46
+ set -eu
47
+ runtime="$REACTORCHECK_GUI_RUNTIME"
48
+ bin_dir="$runtime/usr/bin"
49
+ lib_dir="$runtime/usr/lib/aarch64-linux-gnu"
50
+ tk_dir="$runtime/usr/share/tcltk/tk8.6"
51
+ test -d "$bin_dir"
52
+ test -d "$lib_dir"
53
+ test -d "$tk_dir"
54
+ export PATH="$bin_dir:$PATH"
55
+ export LD_LIBRARY_PATH="$lib_dir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
56
+ export TK_LIBRARY="$tk_dir"
57
+ printf '%s\n' "$bin_dir" >> "$GITHUB_PATH"
58
+ {
59
+ printf 'LD_LIBRARY_PATH=%s\n' "$LD_LIBRARY_PATH"
60
+ printf 'TK_LIBRARY=%s\n' "$TK_LIBRARY"
61
+ } >> "$GITHUB_ENV"
62
+ command -v Xvfb
63
+ command -v xvfb-run
64
+ python -c 'import tkinter; print(tkinter.TkVersion)'
65
+ - name: Create isolated environments
66
+ run: |
67
+ python -m venv "$RUNNER_TEMP/$REACTORCHECK_CI_VENV"
68
+ python -m venv "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV"
69
+ mkdir -p "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT"
70
+ - name: Install project in the isolated environment
71
+ run: |
72
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m pip install --upgrade pip
73
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m pip install -e ".[dev]"
74
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m pip check
75
+ - name: Check formatting
76
+ run: >-
77
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m ruff format --check .
78
+ - name: Lint
79
+ run: >-
80
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m ruff check .
81
+ - name: Type check
82
+ run: >-
83
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m mypy src
84
+ - name: Unit, integration, and scientific tests
85
+ run: >-
86
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m pytest
87
+ - name: Build and validate distributions
88
+ run: |
89
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m build
90
+ "$RUNNER_TEMP/$REACTORCHECK_CI_VENV/bin/python" -m twine check dist/*
91
+ - name: Verify clean wheel on ARM64
92
+ run: |
93
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/python" -m pip install --upgrade pip
94
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/python" -m pip install dist/*.whl
95
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/python" -m pip check
96
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/python" - <<'PY'
97
+ import importlib.metadata
98
+ import platform
99
+ import reactorcheck
100
+
101
+ machine = platform.machine().lower()
102
+ assert machine in {"aarch64", "arm64"}, machine
103
+ assert reactorcheck.__version__ == importlib.metadata.version("reactorcheck")
104
+ print(machine, reactorcheck.__version__, reactorcheck.__file__)
105
+ PY
106
+ - name: Exercise installed CLI and example workflow
107
+ run: |
108
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/reactorcheck" --help
109
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/reactorcheck" --version
110
+ "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/reactorcheck" analyze \
111
+ examples/synthetic_composition.csv \
112
+ --config examples/synthetic_composition_config.json \
113
+ --output "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT/installed.xlsx" \
114
+ --plot "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT/installed.png"
115
+ test -s "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT/installed.xlsx"
116
+ test -s "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT/installed.png"
117
+ - name: Exercise installed GUI wiring
118
+ run: |
119
+ xvfb-run -a "$RUNNER_TEMP/$REACTORCHECK_WHEEL_VENV/bin/python" \
120
+ tests/gui_widget_smoke.py \
121
+ examples/synthetic_composition.csv \
122
+ examples/synthetic_composition_config.json \
123
+ "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT/gui-wired.xlsx"
124
+ test -s "$RUNNER_TEMP/$REACTORCHECK_CI_OUTPUT/gui-wired.xlsx"
125
+ - name: Remove isolated environments and generated files
126
+ if: always()
127
+ run: |
128
+ python - <<'PY'
129
+ import os
130
+ from pathlib import Path
131
+ import shutil
132
+
133
+ runner_temp = Path(os.environ["RUNNER_TEMP"]).resolve()
134
+ workspace = Path(os.environ["GITHUB_WORKSPACE"]).resolve()
135
+ for variable in (
136
+ "REACTORCHECK_CI_VENV",
137
+ "REACTORCHECK_WHEEL_VENV",
138
+ "REACTORCHECK_CI_OUTPUT",
139
+ ):
140
+ target = (runner_temp / os.environ[variable]).resolve()
141
+ if runner_temp not in target.parents:
142
+ raise RuntimeError(f"Refusing to clean outside runner temp: {target}")
143
+ shutil.rmtree(target, ignore_errors=True)
144
+ for relative in (
145
+ "build",
146
+ "dist",
147
+ ".mypy_cache",
148
+ ".pytest_cache",
149
+ ".ruff_cache",
150
+ ".coverage",
151
+ "htmlcov",
152
+ ):
153
+ target = (workspace / relative).resolve()
154
+ if workspace not in target.parents:
155
+ raise RuntimeError(f"Refusing to clean outside workspace: {target}")
156
+ if target.is_dir():
157
+ shutil.rmtree(target)
158
+ elif target.exists():
159
+ target.unlink()
160
+ for target in workspace.rglob("__pycache__"):
161
+ if workspace in target.resolve().parents:
162
+ shutil.rmtree(target)
163
+ PY
164
+ test -z "$(git status --porcelain)"
@@ -11,8 +11,8 @@ jobs:
11
11
  permissions:
12
12
  contents: read
13
13
  steps:
14
- - uses: actions/checkout@v4
15
- - uses: actions/setup-python@v5
14
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
15
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
16
16
  with:
17
17
  python-version: "3.12"
18
18
  cache: pip
@@ -42,7 +42,7 @@ jobs:
42
42
  examples/synthetic_composition.csv \
43
43
  examples/synthetic_composition_config.json \
44
44
  /tmp/reactorcheck-release-gui.xlsx
45
- - uses: actions/upload-artifact@v4
45
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
46
46
  with:
47
47
  name: python-package-distributions
48
48
  path: dist/
@@ -57,8 +57,8 @@ jobs:
57
57
  permissions:
58
58
  id-token: write
59
59
  steps:
60
- - uses: actions/download-artifact@v4
60
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
61
61
  with:
62
62
  name: python-package-distributions
63
63
  path: dist/
64
- - uses: pypa/gh-action-pypi-publish@release/v1
64
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
@@ -6,6 +6,7 @@ __pycache__/
6
6
  .pytest_cache/
7
7
  .ruff_cache/
8
8
  .venv/
9
+ uv.lock
9
10
  build/
10
11
  dist/
11
12
  htmlcov/
@@ -3,7 +3,31 @@
3
3
  All notable changes follow [Keep a Changelog](https://keepachangelog.com/) and
4
4
  versions follow semantic versioning.
5
5
 
6
- ## [0.2.0] - Unreleased
6
+ ## [0.2.2] - 2026-08-23
7
+
8
+ ### Added
9
+
10
+ - Added checksum-pinned, opt-in validation against selected public fixed-bed
11
+ reactor and composition datasets without vendoring their source files.
12
+ - Added helium to the explicit species model for user-confirmed internal-standard
13
+ reconstruction.
14
+
15
+ ### Fixed
16
+
17
+ - Detect structurally consistent comma, semicolon, or tab delimiters instead of
18
+ treating every CSV as comma-delimited.
19
+ - Exclude explicit result and uncertainty headers from conservative species
20
+ mapping suggestions while preserving detector ambiguity for user review.
21
+ - Updated the release workflow to current Node 24 GitHub actions.
22
+
23
+ ## [0.2.1] - 2026-08-23
24
+
25
+ ### Fixed
26
+
27
+ - Corrected the primary installation and publication-status documentation for
28
+ the public PyPI package. There are no scientific API or calculation changes.
29
+
30
+ ## [0.2.0] - 2026-08-23
7
31
 
8
32
  ### Added
9
33
 
@@ -12,8 +36,7 @@ versions follow semantic versioning.
12
36
  - Independent raw/normalized treatment and wet/dry water-basis settings.
13
37
  - GUI controls, CLI/config support, composition QC, and full reconstruction
14
38
  provenance for the mole-fraction workflow.
15
- - PyPI Trusted Publishing release workflow preparation; no publication has been
16
- performed.
39
+ - PyPI Trusted Publishing release workflow with clean-wheel and GUI validation.
17
40
 
18
41
  ## [0.1.0] - 2026-08-23
19
42
 
@@ -2,7 +2,8 @@ cff-version: 1.2.0
2
2
  message: "If you use ReactorCheck, please cite this software."
3
3
  title: "ReactorCheck"
4
4
  type: software
5
- version: 0.2.0
5
+ version: 0.2.2
6
+ date-released: 2026-08-23
6
7
  license: MIT
7
8
  repository-code: "https://github.com/hdkim99/ReactorCheck"
8
9
  authors:
@@ -14,3 +14,11 @@ data, credentials, or personally identifying metadata.
14
14
  After changing the public composition example, run
15
15
  `python scripts/generate_example_assets.py` and inspect both PNG files before
16
16
  committing the regenerated XLSX/visual assets.
17
+
18
+ ## Self-hosted CI safety
19
+
20
+ The required CI job runs on the persistent `dgx-spark` self-hosted runner.
21
+ Pushes, manual dispatches, and pull requests from this repository may use that
22
+ runner. Pull requests from forks are deliberately skipped so unreviewed fork
23
+ code cannot execute on research hardware. Maintainers must not weaken this gate;
24
+ review fork changes before reproducing them in a same-repository branch.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: reactorcheck
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Unit-aware catalytic reactor analysis from compositions or measured species flows.
5
5
  Project-URL: Homepage, https://github.com/hdkim99/ReactorCheck
6
6
  Project-URL: Repository, https://github.com/hdkim99/ReactorCheck
@@ -63,7 +63,7 @@ Description-Content-Type: text/markdown
63
63
 
64
64
  [![CI](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml/badge.svg)](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml)
65
65
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
66
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
66
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/hdkim99/ReactorCheck/blob/main/LICENSE)
67
67
 
68
68
  ![ReactorCheck internal-standard composition analysis](https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/docs/assets/composition-result.png)
69
69
 
@@ -83,14 +83,15 @@ settings, and source provenance.
83
83
  ## Install
84
84
 
85
85
  Python 3.10 or newer is required. Tk is needed only for the desktop GUI.
86
- PyPI publication is prepared but has not been performed; install the current
87
- public source directly:
88
86
 
89
87
  ```bash
90
- python -m pip install "git+https://github.com/hdkim99/ReactorCheck.git"
88
+ python -m pip install reactorcheck
91
89
  ```
92
90
 
93
- ## 30-second composition quickstart
91
+ For the bundled example datasets, unreleased development code, or contributions,
92
+ clone the public source and use an editable install instead:
93
+
94
+ ## 30-second bundled example (source install)
94
95
 
95
96
  ```bash
96
97
  git clone https://github.com/hdkim99/ReactorCheck.git
@@ -104,8 +105,8 @@ reactorcheck-gui
104
105
  ```
105
106
 
106
107
  The synthetic CO hydrogenation example is available as both
107
- [`CSV`](examples/synthetic_composition.csv) and
108
- [`XLSX`](examples/synthetic_composition.xlsx). Its hand calculation reconstructs
108
+ [`CSV`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.csv) and
109
+ [`XLSX`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.xlsx). Its hand calculation reconstructs
109
110
  CO/H2/CH3OH/N2 outlet flows of 0.5/1.0/0.5/1.0 mol/h.
110
111
 
111
112
  The backward-compatible direct-flow example remains available:
@@ -116,7 +117,7 @@ reactorcheck analyze examples/synthetic_reactor.csv \
116
117
  --output reactorcheck-direct.xlsx
117
118
  ```
118
119
 
119
- ## Supported scope in 0.2.0
120
+ ## Supported scope in 0.2.x
120
121
 
121
122
  | Capability | Status | Notes |
122
123
  |---|---|---|
@@ -131,7 +132,7 @@ reactorcheck analyze examples/synthetic_reactor.csv \
131
132
  | Rate, mass STY, GHSV, WHSV | Supported | Definitions and units are explicit |
132
133
  | Multi-variable steady state + override | Supported | Candidate detection, not physical proof |
133
134
  | QC, plot, Excel/CSV export | Supported | Settings and provenance included |
134
- | Multi-reactant conversion/selectivity basis | Planned | No implicit combined denominator in 0.2 |
135
+ | Multi-reactant conversion/selectivity basis | Planned | No implicit combined denominator in 0.2.x |
135
136
 
136
137
  ## Scientific safeguards
137
138
 
@@ -145,8 +146,18 @@ single `composition.basis` key is rejected rather than guessed.
145
146
  Raw composition sums are always retained and checked against a configured
146
147
  tolerance. Normalization does not change the internal-standard ratio, a property
147
148
  covered by scientific regression tests. See
148
- [`docs/scientific-definitions.md`](docs/scientific-definitions.md) and the complete
149
- [`composition configuration`](examples/synthetic_composition_config.json).
149
+ [`docs/scientific-definitions.md`](https://github.com/hdkim99/ReactorCheck/blob/main/docs/scientific-definitions.md) and the complete
150
+ [`composition configuration`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition_config.json).
151
+
152
+ ## Selected public real-data validation
153
+
154
+ ReactorCheck's IO and mapping paths have also been exercised against selected
155
+ public fixed-bed reactor exports: a Zenodo online-GC workbook/processed-flow
156
+ pair and a Mendeley Data dry-composition table. This does not imply validation
157
+ for every instrument or published metric definition. Dataset DOI, license,
158
+ checksums, files/columns used, failures found, scientific boundaries, and the
159
+ opt-in reproduction command are recorded in
160
+ [`docs/public-data-sources.md`](https://github.com/hdkim99/ReactorCheck/blob/main/docs/public-data-sources.md).
150
161
 
151
162
  ## Outputs
152
163
 
@@ -157,7 +168,7 @@ internal-standard feed, reconstruction equation, and the user's assumption text.
157
168
 
158
169
  ## Limitations
159
170
 
160
- - Version 0.2 uses one configured reference reactant; multi-reactant aggregate
171
+ - Version 0.2.x uses one configured reference reactant; multi-reactant aggregate
161
172
  bases and stoichiometric selectivity coefficients are planned, not inferred.
162
173
  - Internal-standard reconstruction assumes `F_std,out = F_std,in` exactly as the
163
174
  user declares; ReactorCheck cannot prove nonreactivity from composition data.
@@ -190,6 +201,9 @@ twine check dist/*
190
201
  ```
191
202
 
192
203
  Synthetic example data are MIT-licensed with the project. See
193
- [CONTRIBUTING.md](CONTRIBUTING.md) and [CITATION.cff](CITATION.cff).
194
- The 1280×640 [`social-preview.png`](docs/assets/social-preview.png) is the current
195
- repository social-preview candidate and is generated from the same real example.
204
+ [CONTRIBUTING.md](https://github.com/hdkim99/ReactorCheck/blob/main/CONTRIBUTING.md)
205
+ and [CITATION.cff](https://github.com/hdkim99/ReactorCheck/blob/main/CITATION.cff).
206
+ The 1280×640
207
+ [`social-preview.png`](https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/docs/assets/social-preview.png)
208
+ is the current repository social-preview candidate and is generated from the same
209
+ synthetic composition example shown above.
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![CI](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml/badge.svg)](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml)
6
6
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
7
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/hdkim99/ReactorCheck/blob/main/LICENSE)
8
8
 
9
9
  ![ReactorCheck internal-standard composition analysis](https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/docs/assets/composition-result.png)
10
10
 
@@ -24,14 +24,15 @@ settings, and source provenance.
24
24
  ## Install
25
25
 
26
26
  Python 3.10 or newer is required. Tk is needed only for the desktop GUI.
27
- PyPI publication is prepared but has not been performed; install the current
28
- public source directly:
29
27
 
30
28
  ```bash
31
- python -m pip install "git+https://github.com/hdkim99/ReactorCheck.git"
29
+ python -m pip install reactorcheck
32
30
  ```
33
31
 
34
- ## 30-second composition quickstart
32
+ For the bundled example datasets, unreleased development code, or contributions,
33
+ clone the public source and use an editable install instead:
34
+
35
+ ## 30-second bundled example (source install)
35
36
 
36
37
  ```bash
37
38
  git clone https://github.com/hdkim99/ReactorCheck.git
@@ -45,8 +46,8 @@ reactorcheck-gui
45
46
  ```
46
47
 
47
48
  The synthetic CO hydrogenation example is available as both
48
- [`CSV`](examples/synthetic_composition.csv) and
49
- [`XLSX`](examples/synthetic_composition.xlsx). Its hand calculation reconstructs
49
+ [`CSV`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.csv) and
50
+ [`XLSX`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.xlsx). Its hand calculation reconstructs
50
51
  CO/H2/CH3OH/N2 outlet flows of 0.5/1.0/0.5/1.0 mol/h.
51
52
 
52
53
  The backward-compatible direct-flow example remains available:
@@ -57,7 +58,7 @@ reactorcheck analyze examples/synthetic_reactor.csv \
57
58
  --output reactorcheck-direct.xlsx
58
59
  ```
59
60
 
60
- ## Supported scope in 0.2.0
61
+ ## Supported scope in 0.2.x
61
62
 
62
63
  | Capability | Status | Notes |
63
64
  |---|---|---|
@@ -72,7 +73,7 @@ reactorcheck analyze examples/synthetic_reactor.csv \
72
73
  | Rate, mass STY, GHSV, WHSV | Supported | Definitions and units are explicit |
73
74
  | Multi-variable steady state + override | Supported | Candidate detection, not physical proof |
74
75
  | QC, plot, Excel/CSV export | Supported | Settings and provenance included |
75
- | Multi-reactant conversion/selectivity basis | Planned | No implicit combined denominator in 0.2 |
76
+ | Multi-reactant conversion/selectivity basis | Planned | No implicit combined denominator in 0.2.x |
76
77
 
77
78
  ## Scientific safeguards
78
79
 
@@ -86,8 +87,18 @@ single `composition.basis` key is rejected rather than guessed.
86
87
  Raw composition sums are always retained and checked against a configured
87
88
  tolerance. Normalization does not change the internal-standard ratio, a property
88
89
  covered by scientific regression tests. See
89
- [`docs/scientific-definitions.md`](docs/scientific-definitions.md) and the complete
90
- [`composition configuration`](examples/synthetic_composition_config.json).
90
+ [`docs/scientific-definitions.md`](https://github.com/hdkim99/ReactorCheck/blob/main/docs/scientific-definitions.md) and the complete
91
+ [`composition configuration`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition_config.json).
92
+
93
+ ## Selected public real-data validation
94
+
95
+ ReactorCheck's IO and mapping paths have also been exercised against selected
96
+ public fixed-bed reactor exports: a Zenodo online-GC workbook/processed-flow
97
+ pair and a Mendeley Data dry-composition table. This does not imply validation
98
+ for every instrument or published metric definition. Dataset DOI, license,
99
+ checksums, files/columns used, failures found, scientific boundaries, and the
100
+ opt-in reproduction command are recorded in
101
+ [`docs/public-data-sources.md`](https://github.com/hdkim99/ReactorCheck/blob/main/docs/public-data-sources.md).
91
102
 
92
103
  ## Outputs
93
104
 
@@ -98,7 +109,7 @@ internal-standard feed, reconstruction equation, and the user's assumption text.
98
109
 
99
110
  ## Limitations
100
111
 
101
- - Version 0.2 uses one configured reference reactant; multi-reactant aggregate
112
+ - Version 0.2.x uses one configured reference reactant; multi-reactant aggregate
102
113
  bases and stoichiometric selectivity coefficients are planned, not inferred.
103
114
  - Internal-standard reconstruction assumes `F_std,out = F_std,in` exactly as the
104
115
  user declares; ReactorCheck cannot prove nonreactivity from composition data.
@@ -131,6 +142,9 @@ twine check dist/*
131
142
  ```
132
143
 
133
144
  Synthetic example data are MIT-licensed with the project. See
134
- [CONTRIBUTING.md](CONTRIBUTING.md) and [CITATION.cff](CITATION.cff).
135
- The 1280×640 [`social-preview.png`](docs/assets/social-preview.png) is the current
136
- repository social-preview candidate and is generated from the same real example.
145
+ [CONTRIBUTING.md](https://github.com/hdkim99/ReactorCheck/blob/main/CONTRIBUTING.md)
146
+ and [CITATION.cff](https://github.com/hdkim99/ReactorCheck/blob/main/CITATION.cff).
147
+ The 1280×640
148
+ [`social-preview.png`](https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/docs/assets/social-preview.png)
149
+ is the current repository social-preview candidate and is generated from the same
150
+ synthetic composition example shown above.