pyrestoolbox 3.8.5__tar.gz → 3.8.7__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.
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/.github/workflows/build-wheels.yml +4 -22
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/.github/workflows/tests.yml +14 -11
- pyrestoolbox-3.8.7/Cargo.lock +409 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/Cargo.toml +3 -2
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/PKG-INFO +6 -5
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/README.rst +1 -1
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyproject.toml +5 -4
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/changelist.rst +12 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/simtools.rst +2 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_aquifer.py +11 -3
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/setup.cfg +4 -1
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/setup.py +4 -4
- pyrestoolbox-3.8.7/src/gwr.rs +605 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/lib.rs +1 -1
- pyrestoolbox-3.8.7/src/mpfloat.rs +242 -0
- pyrestoolbox-3.8.5/Cargo.lock +0 -230
- pyrestoolbox-3.8.5/src/bessel.rs +0 -202
- pyrestoolbox-3.8.5/src/gwr.rs +0 -629
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/.github/complexity-baseline.json +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/.github/scripts/check_complexity.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/.gitignore +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/LICENSE +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/MANIFEST.in +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/ResToolbox/privacy_policy.md +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/build_pure_python.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/clippy.toml +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/Dockerfile +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/README.md +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/pyproject.toml +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/pyrestoolbox_mcp/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/pyrestoolbox_mcp/serialize.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/pyrestoolbox_mcp/server.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/mcp/tests/test_server.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/_accelerator.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_dielectric.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_maoduan_viscosity.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_pitzer_params.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_salting_library.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_vle_engine.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/appelo_volumes.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/brine.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/iapws_viscosity.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/jones_dole_viscosity.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/kestin_nacl_viscosity.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/pr_vphi.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/viscosity_route.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/vphi_route.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/classes/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/classes/classes.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/constants/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/constants/constants.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/dca/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/dca/dca.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/brine.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/dca.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/examples.ipynb +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/gas.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/bot.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/bot_PVTO.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/bot_img.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/dry_gas.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/grid_sat_df.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/influence.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/properties_df.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/sgof.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/swof.png +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/index.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/layer.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/library.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/matbal.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/nodal.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/nodal_examples.ipynb +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/nodal_hydrate_demo.ipynb +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/oil.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/plyasunov.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/recommend.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/sensitivity.rst +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/gas/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/gas/_hydrate.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/gas/gas.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/layer/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/layer/layer.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/library/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/library/component_library.xlsx +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/library/library.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/matbal/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/matbal/matbal.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/nodal/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/nodal/nodal.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_compressibility.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_constants.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_correlations.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_density.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_harmonize.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_pvt_class.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_rate.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_separator.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_tables.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_utils.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/iapws_if97.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/plyasunov_model.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/water_properties.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/recommend/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/recommend/recommend.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/sensitivity/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/sensitivity/sensitivity.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/shared_fns/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/shared_fns/shared_fns.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_decks.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_pvt_tables.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_relperm.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_vfp.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/simtools.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/validate/__init__.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/pyrestoolbox/validate/validate.py +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/brine_visc/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/brine_visc/salt.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/brine_visc/water.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/critical_properties/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/dca/hyperbolic.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/dca/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/dca/ransac.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/gas_viscosity/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/matbal/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/matbal/objective.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/oil/density.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/oil/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/pseudopressure.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/spycher_pruess/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/spycher_pruess/solubility.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/alpha.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/bip.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/components.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/eos.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/flash.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/fugacity.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/k_init.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vle/rachford_rice.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/constants.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/friction.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/holdup_bb.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/holdup_gray.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/holdup_wg.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/ift.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/march.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/mod.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/pvt_helpers.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/vlp/static_column.rs +0 -0
- {pyrestoolbox-3.8.5 → pyrestoolbox-3.8.7}/src/zfactor/mod.rs +0 -0
|
@@ -27,18 +27,10 @@ jobs:
|
|
|
27
27
|
python-version: "3.12"
|
|
28
28
|
|
|
29
29
|
- name: Install Rust toolchain
|
|
30
|
-
if: matrix.os != 'windows-latest'
|
|
31
30
|
uses: dtolnay/rust-toolchain@stable
|
|
32
31
|
with:
|
|
33
32
|
targets: ${{ matrix.os == 'macos-14' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
|
|
34
33
|
|
|
35
|
-
- name: Install Rust toolchain (Windows GNU)
|
|
36
|
-
if: matrix.os == 'windows-latest'
|
|
37
|
-
run: |
|
|
38
|
-
rustup toolchain install stable-x86_64-pc-windows-gnu
|
|
39
|
-
rustup default stable-x86_64-pc-windows-gnu
|
|
40
|
-
shell: bash
|
|
41
|
-
|
|
42
34
|
- name: Build wheels via cibuildwheel
|
|
43
35
|
uses: pypa/cibuildwheel@v2.23
|
|
44
36
|
env:
|
|
@@ -50,23 +42,12 @@ jobs:
|
|
|
50
42
|
CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux*"
|
|
51
43
|
# maturin needs Rust in the build container
|
|
52
44
|
CIBW_BEFORE_ALL_LINUX: >
|
|
53
|
-
yum install -y m4 diffutils &&
|
|
54
45
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|
55
46
|
CIBW_ENVIRONMENT_LINUX: 'PATH="$HOME/.cargo/bin:$PATH"'
|
|
56
47
|
# macOS: build native arch only per runner (no cross-compilation)
|
|
57
48
|
CIBW_ARCHS_MACOS: "arm64"
|
|
58
49
|
CIBW_ARCHS_LINUX: "x86_64"
|
|
59
50
|
CIBW_ARCHS_WINDOWS: "AMD64"
|
|
60
|
-
# Windows: use gnu target so GMP can build with MinGW GCC.
|
|
61
|
-
# MSYS2 is pre-installed on windows-latest runners.
|
|
62
|
-
CIBW_BEFORE_ALL_WINDOWS: >
|
|
63
|
-
C:\msys64\usr\bin\pacman.exe -S --noconfirm
|
|
64
|
-
mingw-w64-x86_64-gcc
|
|
65
|
-
m4
|
|
66
|
-
diffutils
|
|
67
|
-
make
|
|
68
|
-
CIBW_ENVIRONMENT_WINDOWS: >
|
|
69
|
-
PATH="C:\\msys64\\mingw64\\bin;C:\\msys64\\usr\\bin;$PATH"
|
|
70
51
|
# Rust cross-compile env for macOS x86_64 on arm64 runner
|
|
71
52
|
CIBW_ENVIRONMENT_MACOS: >
|
|
72
53
|
CARGO_BUILD_TARGET="aarch64-apple-darwin"
|
|
@@ -80,9 +61,10 @@ jobs:
|
|
|
80
61
|
# missing OpenBLAS (this broke the v3.6.0 first build attempt - the
|
|
81
62
|
# skip is load-bearing, do not remove it). Linux import + full-suite
|
|
82
63
|
# coverage lives in .github/workflows/tests.yml instead.
|
|
83
|
-
# Also skip
|
|
84
|
-
#
|
|
85
|
-
|
|
64
|
+
# Also skip cp39 (dependency ilt-inversion may not have matching
|
|
65
|
+
# wheels on PyPI yet). macOS tests run again: the skip was for an
|
|
66
|
+
# MPFR symbol issue, and the crate no longer links GMP/MPFR.
|
|
67
|
+
CIBW_TEST_SKIP: "*-manylinux* cp39-*"
|
|
86
68
|
|
|
87
69
|
- uses: actions/upload-artifact@v6
|
|
88
70
|
with:
|
|
@@ -30,9 +30,18 @@ jobs:
|
|
|
30
30
|
run: python3 -m pytest pyrestoolbox/tests/ -q
|
|
31
31
|
|
|
32
32
|
# ── Full test suite with Rust extension (includes parity tests) ──────
|
|
33
|
+
# Linux plus macOS and Windows: the extension is pure Rust (astro-float), so
|
|
34
|
+
# every platform builds it with the default toolchain and runs the suite.
|
|
33
35
|
test-with-rust:
|
|
34
|
-
name: Rust-accelerated (parity tests)
|
|
35
|
-
runs-on:
|
|
36
|
+
name: Rust-accelerated (parity tests)${{ matrix.os != 'ubuntu-latest' && format(' - {0}', matrix.os) || '' }}
|
|
37
|
+
runs-on: ${{ matrix.os }}
|
|
38
|
+
strategy:
|
|
39
|
+
fail-fast: false
|
|
40
|
+
matrix:
|
|
41
|
+
os: [ubuntu-latest, macos-14, windows-latest]
|
|
42
|
+
defaults:
|
|
43
|
+
run:
|
|
44
|
+
shell: bash
|
|
36
45
|
steps:
|
|
37
46
|
- uses: actions/checkout@v5
|
|
38
47
|
|
|
@@ -43,9 +52,6 @@ jobs:
|
|
|
43
52
|
- name: Install Rust toolchain
|
|
44
53
|
uses: dtolnay/rust-toolchain@stable
|
|
45
54
|
|
|
46
|
-
- name: Install m4 (needed by gmp-mpfr-sys for the rug crate)
|
|
47
|
-
run: sudo apt-get update -qq && sudo apt-get install -y -qq m4
|
|
48
|
-
|
|
49
55
|
- name: Install dependencies
|
|
50
56
|
run: pip install numpy scipy pandas tabulate openpyxl mpmath ilt-inversion pytest maturin
|
|
51
57
|
|
|
@@ -55,13 +61,13 @@ jobs:
|
|
|
55
61
|
# Tests import the repo source tree, so the compiled extension must
|
|
56
62
|
# live inside it for the Rust paths to load.
|
|
57
63
|
- name: Copy extension into source tree
|
|
58
|
-
run:
|
|
64
|
+
run: python -c "import glob, zipfile; z = zipfile.ZipFile(glob.glob('dist/*.whl')[0]); [z.extract(n, '.') for n in z.namelist() if n.startswith('pyrestoolbox/_native')]"
|
|
59
65
|
|
|
60
66
|
- name: Verify Rust extension loads
|
|
61
|
-
run:
|
|
67
|
+
run: python -c "from pyrestoolbox._accelerator import get_status; s = get_status(); print(s); assert s['rust_available'], s"
|
|
62
68
|
|
|
63
69
|
- name: Run full test suite (Rust + parity)
|
|
64
|
-
run:
|
|
70
|
+
run: python -m pytest pyrestoolbox/tests/ -q
|
|
65
71
|
|
|
66
72
|
# ── MCP server (separate distribution in mcp/) on both SDK majors ────
|
|
67
73
|
# The server picks FastMCP (1.x) or MCPServer (2.x) at import; test both so
|
|
@@ -117,9 +123,6 @@ jobs:
|
|
|
117
123
|
with:
|
|
118
124
|
components: clippy
|
|
119
125
|
|
|
120
|
-
- name: Install m4 (needed by gmp-mpfr-sys for the rug crate)
|
|
121
|
-
run: sudo apt-get update -qq && sudo apt-get install -y -qq m4
|
|
122
|
-
|
|
123
126
|
- name: Clippy
|
|
124
127
|
run: cargo clippy --all-targets -- -D warnings
|
|
125
128
|
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "astro-float"
|
|
7
|
+
version = "0.9.6"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "2cf6ecd69dd6fbe3763187ff2fa2b0e475b79f04ed86f631a7bc6b04ede0355e"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"astro-float-macro",
|
|
12
|
+
"astro-float-num",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
[[package]]
|
|
16
|
+
name = "astro-float-macro"
|
|
17
|
+
version = "0.4.6"
|
|
18
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
19
|
+
checksum = "9c007205ae7076600c8a59022866990afac02ff186f9031839f67ecce4df2146"
|
|
20
|
+
dependencies = [
|
|
21
|
+
"astro-float-num",
|
|
22
|
+
"proc-macro2",
|
|
23
|
+
"quote",
|
|
24
|
+
"syn 1.0.109",
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
[[package]]
|
|
28
|
+
name = "astro-float-num"
|
|
29
|
+
version = "0.3.7"
|
|
30
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
31
|
+
checksum = "bc7f6a0312e8f5845f84241b21bd2394d49940b6bc333c6a84f992e6dc9ebb85"
|
|
32
|
+
dependencies = [
|
|
33
|
+
"itertools",
|
|
34
|
+
"lazy_static",
|
|
35
|
+
"rand",
|
|
36
|
+
"serde",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[[package]]
|
|
40
|
+
name = "autocfg"
|
|
41
|
+
version = "1.5.0"
|
|
42
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
43
|
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
|
44
|
+
|
|
45
|
+
[[package]]
|
|
46
|
+
name = "cfg-if"
|
|
47
|
+
version = "1.0.4"
|
|
48
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
49
|
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
50
|
+
|
|
51
|
+
[[package]]
|
|
52
|
+
name = "crossbeam-deque"
|
|
53
|
+
version = "0.8.8"
|
|
54
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
55
|
+
checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a"
|
|
56
|
+
dependencies = [
|
|
57
|
+
"crossbeam-epoch",
|
|
58
|
+
"crossbeam-utils",
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
[[package]]
|
|
62
|
+
name = "crossbeam-epoch"
|
|
63
|
+
version = "0.9.21"
|
|
64
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
65
|
+
checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d"
|
|
66
|
+
dependencies = [
|
|
67
|
+
"crossbeam-utils",
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
[[package]]
|
|
71
|
+
name = "crossbeam-utils"
|
|
72
|
+
version = "0.8.23"
|
|
73
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
74
|
+
checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
|
|
75
|
+
|
|
76
|
+
[[package]]
|
|
77
|
+
name = "either"
|
|
78
|
+
version = "1.19.0"
|
|
79
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
80
|
+
checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
|
|
81
|
+
|
|
82
|
+
[[package]]
|
|
83
|
+
name = "getrandom"
|
|
84
|
+
version = "0.2.17"
|
|
85
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
86
|
+
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
|
|
87
|
+
dependencies = [
|
|
88
|
+
"cfg-if",
|
|
89
|
+
"libc",
|
|
90
|
+
"wasi",
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
[[package]]
|
|
94
|
+
name = "heck"
|
|
95
|
+
version = "0.5.0"
|
|
96
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
97
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
98
|
+
|
|
99
|
+
[[package]]
|
|
100
|
+
name = "indoc"
|
|
101
|
+
version = "2.0.7"
|
|
102
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
103
|
+
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
|
|
104
|
+
dependencies = [
|
|
105
|
+
"rustversion",
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
[[package]]
|
|
109
|
+
name = "itertools"
|
|
110
|
+
version = "0.10.5"
|
|
111
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
112
|
+
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
|
|
113
|
+
dependencies = [
|
|
114
|
+
"either",
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
[[package]]
|
|
118
|
+
name = "lazy_static"
|
|
119
|
+
version = "1.5.1"
|
|
120
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
121
|
+
checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb"
|
|
122
|
+
|
|
123
|
+
[[package]]
|
|
124
|
+
name = "libc"
|
|
125
|
+
version = "0.2.184"
|
|
126
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
127
|
+
checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
|
|
128
|
+
|
|
129
|
+
[[package]]
|
|
130
|
+
name = "memoffset"
|
|
131
|
+
version = "0.9.1"
|
|
132
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
133
|
+
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
|
134
|
+
dependencies = [
|
|
135
|
+
"autocfg",
|
|
136
|
+
]
|
|
137
|
+
|
|
138
|
+
[[package]]
|
|
139
|
+
name = "once_cell"
|
|
140
|
+
version = "1.21.4"
|
|
141
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
142
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
143
|
+
|
|
144
|
+
[[package]]
|
|
145
|
+
name = "portable-atomic"
|
|
146
|
+
version = "1.13.1"
|
|
147
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
148
|
+
checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
|
|
149
|
+
|
|
150
|
+
[[package]]
|
|
151
|
+
name = "ppv-lite86"
|
|
152
|
+
version = "0.2.21"
|
|
153
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
154
|
+
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
|
155
|
+
dependencies = [
|
|
156
|
+
"zerocopy",
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
[[package]]
|
|
160
|
+
name = "proc-macro2"
|
|
161
|
+
version = "1.0.106"
|
|
162
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
163
|
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
164
|
+
dependencies = [
|
|
165
|
+
"unicode-ident",
|
|
166
|
+
]
|
|
167
|
+
|
|
168
|
+
[[package]]
|
|
169
|
+
name = "pyo3"
|
|
170
|
+
version = "0.23.5"
|
|
171
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
172
|
+
checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872"
|
|
173
|
+
dependencies = [
|
|
174
|
+
"cfg-if",
|
|
175
|
+
"indoc",
|
|
176
|
+
"libc",
|
|
177
|
+
"memoffset",
|
|
178
|
+
"once_cell",
|
|
179
|
+
"portable-atomic",
|
|
180
|
+
"pyo3-build-config",
|
|
181
|
+
"pyo3-ffi",
|
|
182
|
+
"pyo3-macros",
|
|
183
|
+
"unindent",
|
|
184
|
+
]
|
|
185
|
+
|
|
186
|
+
[[package]]
|
|
187
|
+
name = "pyo3-build-config"
|
|
188
|
+
version = "0.23.5"
|
|
189
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
190
|
+
checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb"
|
|
191
|
+
dependencies = [
|
|
192
|
+
"once_cell",
|
|
193
|
+
"target-lexicon",
|
|
194
|
+
]
|
|
195
|
+
|
|
196
|
+
[[package]]
|
|
197
|
+
name = "pyo3-ffi"
|
|
198
|
+
version = "0.23.5"
|
|
199
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
200
|
+
checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d"
|
|
201
|
+
dependencies = [
|
|
202
|
+
"libc",
|
|
203
|
+
"pyo3-build-config",
|
|
204
|
+
]
|
|
205
|
+
|
|
206
|
+
[[package]]
|
|
207
|
+
name = "pyo3-macros"
|
|
208
|
+
version = "0.23.5"
|
|
209
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
210
|
+
checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da"
|
|
211
|
+
dependencies = [
|
|
212
|
+
"proc-macro2",
|
|
213
|
+
"pyo3-macros-backend",
|
|
214
|
+
"quote",
|
|
215
|
+
"syn 2.0.117",
|
|
216
|
+
]
|
|
217
|
+
|
|
218
|
+
[[package]]
|
|
219
|
+
name = "pyo3-macros-backend"
|
|
220
|
+
version = "0.23.5"
|
|
221
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
222
|
+
checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028"
|
|
223
|
+
dependencies = [
|
|
224
|
+
"heck",
|
|
225
|
+
"proc-macro2",
|
|
226
|
+
"pyo3-build-config",
|
|
227
|
+
"quote",
|
|
228
|
+
"syn 2.0.117",
|
|
229
|
+
]
|
|
230
|
+
|
|
231
|
+
[[package]]
|
|
232
|
+
name = "pyrestoolbox-native"
|
|
233
|
+
version = "3.8.7"
|
|
234
|
+
dependencies = [
|
|
235
|
+
"astro-float",
|
|
236
|
+
"pyo3",
|
|
237
|
+
"rayon",
|
|
238
|
+
]
|
|
239
|
+
|
|
240
|
+
[[package]]
|
|
241
|
+
name = "quote"
|
|
242
|
+
version = "1.0.45"
|
|
243
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
244
|
+
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
|
245
|
+
dependencies = [
|
|
246
|
+
"proc-macro2",
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
[[package]]
|
|
250
|
+
name = "rand"
|
|
251
|
+
version = "0.8.8"
|
|
252
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
253
|
+
checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c"
|
|
254
|
+
dependencies = [
|
|
255
|
+
"libc",
|
|
256
|
+
"rand_chacha",
|
|
257
|
+
"rand_core",
|
|
258
|
+
]
|
|
259
|
+
|
|
260
|
+
[[package]]
|
|
261
|
+
name = "rand_chacha"
|
|
262
|
+
version = "0.3.1"
|
|
263
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
264
|
+
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
|
265
|
+
dependencies = [
|
|
266
|
+
"ppv-lite86",
|
|
267
|
+
"rand_core",
|
|
268
|
+
]
|
|
269
|
+
|
|
270
|
+
[[package]]
|
|
271
|
+
name = "rand_core"
|
|
272
|
+
version = "0.6.4"
|
|
273
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
274
|
+
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
|
275
|
+
dependencies = [
|
|
276
|
+
"getrandom",
|
|
277
|
+
]
|
|
278
|
+
|
|
279
|
+
[[package]]
|
|
280
|
+
name = "rayon"
|
|
281
|
+
version = "1.12.0"
|
|
282
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
283
|
+
checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
|
|
284
|
+
dependencies = [
|
|
285
|
+
"either",
|
|
286
|
+
"rayon-core",
|
|
287
|
+
]
|
|
288
|
+
|
|
289
|
+
[[package]]
|
|
290
|
+
name = "rayon-core"
|
|
291
|
+
version = "1.13.0"
|
|
292
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
293
|
+
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
|
|
294
|
+
dependencies = [
|
|
295
|
+
"crossbeam-deque",
|
|
296
|
+
"crossbeam-utils",
|
|
297
|
+
]
|
|
298
|
+
|
|
299
|
+
[[package]]
|
|
300
|
+
name = "rustversion"
|
|
301
|
+
version = "1.0.22"
|
|
302
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
303
|
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
|
304
|
+
|
|
305
|
+
[[package]]
|
|
306
|
+
name = "serde"
|
|
307
|
+
version = "1.0.229"
|
|
308
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
309
|
+
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
|
|
310
|
+
dependencies = [
|
|
311
|
+
"serde_core",
|
|
312
|
+
]
|
|
313
|
+
|
|
314
|
+
[[package]]
|
|
315
|
+
name = "serde_core"
|
|
316
|
+
version = "1.0.229"
|
|
317
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
318
|
+
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
|
|
319
|
+
dependencies = [
|
|
320
|
+
"serde_derive",
|
|
321
|
+
]
|
|
322
|
+
|
|
323
|
+
[[package]]
|
|
324
|
+
name = "serde_derive"
|
|
325
|
+
version = "1.0.229"
|
|
326
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
327
|
+
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
|
|
328
|
+
dependencies = [
|
|
329
|
+
"proc-macro2",
|
|
330
|
+
"quote",
|
|
331
|
+
"syn 3.0.9",
|
|
332
|
+
]
|
|
333
|
+
|
|
334
|
+
[[package]]
|
|
335
|
+
name = "syn"
|
|
336
|
+
version = "1.0.109"
|
|
337
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
338
|
+
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
|
339
|
+
dependencies = [
|
|
340
|
+
"proc-macro2",
|
|
341
|
+
"quote",
|
|
342
|
+
"unicode-ident",
|
|
343
|
+
]
|
|
344
|
+
|
|
345
|
+
[[package]]
|
|
346
|
+
name = "syn"
|
|
347
|
+
version = "2.0.117"
|
|
348
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
349
|
+
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
|
350
|
+
dependencies = [
|
|
351
|
+
"proc-macro2",
|
|
352
|
+
"quote",
|
|
353
|
+
"unicode-ident",
|
|
354
|
+
]
|
|
355
|
+
|
|
356
|
+
[[package]]
|
|
357
|
+
name = "syn"
|
|
358
|
+
version = "3.0.9"
|
|
359
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
360
|
+
checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
|
|
361
|
+
dependencies = [
|
|
362
|
+
"proc-macro2",
|
|
363
|
+
"quote",
|
|
364
|
+
"unicode-ident",
|
|
365
|
+
]
|
|
366
|
+
|
|
367
|
+
[[package]]
|
|
368
|
+
name = "target-lexicon"
|
|
369
|
+
version = "0.12.16"
|
|
370
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
371
|
+
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
|
372
|
+
|
|
373
|
+
[[package]]
|
|
374
|
+
name = "unicode-ident"
|
|
375
|
+
version = "1.0.24"
|
|
376
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
377
|
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
378
|
+
|
|
379
|
+
[[package]]
|
|
380
|
+
name = "unindent"
|
|
381
|
+
version = "0.2.4"
|
|
382
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
383
|
+
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
384
|
+
|
|
385
|
+
[[package]]
|
|
386
|
+
name = "wasi"
|
|
387
|
+
version = "0.11.1+wasi-snapshot-preview1"
|
|
388
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
389
|
+
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|
390
|
+
|
|
391
|
+
[[package]]
|
|
392
|
+
name = "zerocopy"
|
|
393
|
+
version = "0.8.63"
|
|
394
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
395
|
+
checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8"
|
|
396
|
+
dependencies = [
|
|
397
|
+
"zerocopy-derive",
|
|
398
|
+
]
|
|
399
|
+
|
|
400
|
+
[[package]]
|
|
401
|
+
name = "zerocopy-derive"
|
|
402
|
+
version = "0.8.63"
|
|
403
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
404
|
+
checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f"
|
|
405
|
+
dependencies = [
|
|
406
|
+
"proc-macro2",
|
|
407
|
+
"quote",
|
|
408
|
+
"syn 2.0.117",
|
|
409
|
+
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "pyrestoolbox-native"
|
|
3
|
-
version = "3.8.
|
|
3
|
+
version = "3.8.7"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
license = "GPL-3.0-or-later"
|
|
6
6
|
description = "Rust acceleration extensions for pyResToolbox"
|
|
@@ -11,8 +11,9 @@ name = "_native"
|
|
|
11
11
|
crate-type = ["cdylib"]
|
|
12
12
|
|
|
13
13
|
[dependencies]
|
|
14
|
+
astro-float = "0.9.6"
|
|
14
15
|
pyo3 = { version = "0.23", features = ["extension-module"] }
|
|
15
|
-
|
|
16
|
+
rayon = "1.12.0"
|
|
16
17
|
|
|
17
18
|
[profile.release]
|
|
18
19
|
opt-level = 3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyrestoolbox
|
|
3
|
-
Version: 3.8.
|
|
3
|
+
Version: 3.8.7
|
|
4
4
|
Classifier: Programming Language :: Python :: 3
|
|
5
5
|
Classifier: Programming Language :: Rust
|
|
6
6
|
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
@@ -9,10 +9,11 @@ Requires-Dist: numpy
|
|
|
9
9
|
Requires-Dist: scipy
|
|
10
10
|
Requires-Dist: pandas
|
|
11
11
|
Requires-Dist: tabulate
|
|
12
|
-
Requires-Dist: ilt-inversion
|
|
13
|
-
Requires-Dist: mpmath
|
|
14
|
-
Requires-Dist: gmpy2
|
|
15
12
|
Requires-Dist: openpyxl
|
|
13
|
+
Requires-Dist: ilt-inversion ; extra == 'aquifer'
|
|
14
|
+
Requires-Dist: mpmath ; extra == 'aquifer'
|
|
15
|
+
Requires-Dist: gmpy2 ; extra == 'aquifer'
|
|
16
|
+
Provides-Extra: aquifer
|
|
16
17
|
License-File: LICENSE
|
|
17
18
|
Summary: pyResToolbox - A collection of Reservoir Engineering Utilities
|
|
18
19
|
Keywords: restoolbox,petroleum,reservoir
|
|
@@ -64,7 +65,7 @@ All public PVT, flow rate, and simulation table functions support both oilfield
|
|
|
64
65
|
Rust Acceleration (Optional)
|
|
65
66
|
----------------------------
|
|
66
67
|
|
|
67
|
-
pyResToolbox includes optional Rust-compiled extensions that accelerate computationally intensive algorithms. When the compiled extension is present and loadable, these functions run automatically through Rust with no API changes. When the extension is unavailable, all functions fall back silently to the pure Python implementation.
|
|
68
|
+
pyResToolbox includes optional Rust-compiled extensions that accelerate computationally intensive algorithms. When the compiled extension is present and loadable, these functions run automatically through Rust with no API changes. When the extension is unavailable, all functions fall back silently to the pure Python implementation. The one exception is ``simtools.influence_tables``, whose pure-Python fallback needs the optional ``aquifer`` extra (``pip install 'pyrestoolbox[aquifer]'``).
|
|
68
69
|
|
|
69
70
|
**Accelerated functions:**
|
|
70
71
|
|
|
@@ -39,7 +39,7 @@ All public PVT, flow rate, and simulation table functions support both oilfield
|
|
|
39
39
|
Rust Acceleration (Optional)
|
|
40
40
|
----------------------------
|
|
41
41
|
|
|
42
|
-
pyResToolbox includes optional Rust-compiled extensions that accelerate computationally intensive algorithms. When the compiled extension is present and loadable, these functions run automatically through Rust with no API changes. When the extension is unavailable, all functions fall back silently to the pure Python implementation.
|
|
42
|
+
pyResToolbox includes optional Rust-compiled extensions that accelerate computationally intensive algorithms. When the compiled extension is present and loadable, these functions run automatically through Rust with no API changes. When the extension is unavailable, all functions fall back silently to the pure Python implementation. The one exception is ``simtools.influence_tables``, whose pure-Python fallback needs the optional ``aquifer`` extra (``pip install 'pyrestoolbox[aquifer]'``).
|
|
43
43
|
|
|
44
44
|
**Accelerated functions:**
|
|
45
45
|
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyrestoolbox"
|
|
7
|
-
version = "3.8.
|
|
7
|
+
version = "3.8.7"
|
|
8
8
|
description = "pyResToolbox - A collection of Reservoir Engineering Utilities"
|
|
9
9
|
license = {text = "GPL-3.0-or-later"}
|
|
10
10
|
authors = [{name = "Mark W. Burgoyne", email = "mark.w.burgoyne@gmail.com"}]
|
|
@@ -21,13 +21,14 @@ dependencies = [
|
|
|
21
21
|
"scipy",
|
|
22
22
|
"pandas",
|
|
23
23
|
"tabulate",
|
|
24
|
-
"ilt-inversion",
|
|
25
|
-
"mpmath",
|
|
26
|
-
"gmpy2",
|
|
27
24
|
"openpyxl",
|
|
28
25
|
]
|
|
29
26
|
readme = "README.rst"
|
|
30
27
|
|
|
28
|
+
[project.optional-dependencies]
|
|
29
|
+
# Pure-Python fallback for simtools.influence_tables (the Rust extension needs none of these)
|
|
30
|
+
aquifer = ["ilt-inversion", "mpmath", "gmpy2"]
|
|
31
|
+
|
|
31
32
|
[project.urls]
|
|
32
33
|
Homepage = "https://github.com/mwburgoyne/pyResToolbox"
|
|
33
34
|
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
Changelist in 3.8.7:
|
|
2
|
+
|
|
3
|
+
- **SIMTOOLS: ``influence_tables`` Rust path runs on all CPU threads.** The Bessel evaluations, transform values and GWR accelerations are spread across threads (output identical at any thread count). On a 4-core, 8-thread machine the 126-point table takes 0.06 s at M=7 (0.19 s on one thread, 0.09 s for the 3.8.6 MPFR build) and 0.51 s at M=32 (1.81 s, 1.51 s). For comparison, gwr_inversion 2.0.0's built-in bounded radial transform takes 0.40 s at M=7 on one core and 0.15 s with ``workers=8``, at identical accuracy. ``RAYON_NUM_THREADS`` limits the thread count; see the ``influence_tables`` documentation.
|
|
4
|
+
|
|
5
|
+
- **PACKAGING: the Rust extension no longer needs a C toolchain, and macOS wheels are tested again.** The multiprecision arithmetic behind ``simtools.influence_tables`` moved from the ``rug`` crate (GMP and MPFR, compiled from C) to the pure-Rust ``astro-float`` crate. Windows wheels now build with the standard MSVC Rust toolchain instead of MinGW and MSYS2, building from the sdist needs only Rust (no ``m4``), and the macOS wheel import tests that were skipped for an MPFR linking issue run again. Results agree with the MPFR build to the last bit of f64 output at M of 18 and above, and to within 2.8e-10 (relative) at M=7 and 1.4e-13 at M=12, about four orders of magnitude below the inversion's own error. On one thread it is slower than the MPFR build, partly recovered by evaluating each argument's four Bessel functions from one set of power series and sharing the values at sqrt(s) across ReD: a 126-point table takes 0.19 s at the default M=7 against 0.09 s before (2.1x), narrowing to 1.2x at M=32 (1.81 vs 1.51 s).
|
|
6
|
+
|
|
7
|
+
Changelist in 3.8.6:
|
|
8
|
+
|
|
9
|
+
- **SIMTOOLS: ``influence_tables`` Rust path now holds the precision the inversion needs (results move).** The Rust Gaver-Wynn-Rho inversion evaluates the Van Everdingen-Hurst transform with its own MPFR Bessel functions, and those carried less precision than GWR needs (about 2.1M digits). The series-to-asymptotic switch was fixed at x = 25, where the asymptotic expansion is good to only about 22 digits; the K-series ran with half the guard bits its cancellation needs; pi in the asymptotic prefactors and Euler's constant in the K0 series were f64 or 50-digit constants; and the I1 asymptotic expansion had a sign error. The switch now depends on the working precision, the guard bits match the cancellation, all constants are MPFR, and the I1 sign is corrected. Against a reference converged to 1e-14, the worst point on a 126-point table (ReD 1.5-20, tD 0.01-200) is now 2.2e-5 at M=7 (was 4.5e-5), 1.4e-8 at M=12 (was 1.6e-4), 3.2e-11 at M=18 (was 6.7e-3) and 2e-16 at M=32 (ReD 1.5 at tD 0.044 returned 20.07 against 0.2175), the same convergence as the pure-Python path. At the default M=7 the README example table (ReD 1.5-1000) moves by up to 4.6e-5 relative (ReD 1.5, tD 0.027: 0.172801 to 0.172809), 6e-7 on average. Run time is unchanged or a little shorter (121 against 138 ms for that table at M=7).
|
|
10
|
+
|
|
11
|
+
- **PACKAGING: ``ilt-inversion``, ``mpmath`` and ``gmpy2`` are now an optional extra (``pip install 'pyrestoolbox[aquifer]'``).** Only ``simtools.influence_tables`` uses them, and only on its pure-Python path; the Rust extension in every prebuilt wheel does the inverse Laplace transform and Bessel functions itself in MPFR. ``import pyrestoolbox.simtools`` no longer loads ``ilt`` or ``mpmath``. Without the Rust extension and without the extra, ``influence_tables`` raises ``ImportError`` naming the extra; every other function is unaffected. Existing environments keep working, since upgrading does not uninstall the three packages.
|
|
12
|
+
|
|
1
13
|
Changelist in 3.8.5:
|
|
2
14
|
|
|
3
15
|
- **NODAL: gas VLP uses the ``gas_pvt`` Z-factor and viscosity methods (results move when a GasPVT is passed).** ``fbhp``, ``fthp``, ``outflow_curve``, ``operating_point`` and the simtools VFP tables took only the gas SG and Sutton/Wichert-Aziz pseudo-criticals from a ``GasPVT``; the march always ran Hall-Yarborough Z with Lee-Gonzalez-Eakin viscosity, so ``zmethod='BNS'`` (or the GasPVT default, DAK with PMC) was silently ignored, as were H2 and He (which raised a warning). The march now evaluates Z and viscosity exactly as ``gas_pvt.z()`` and ``gas_pvt.viscosity()`` do, at every step and in the zero-rate static column, in Python and Rust (the Rust march builds the same Z/viscosity evaluator as ``gas_dmp``, so every method stays accelerated; the two paths agree to 1e-9 relative). Calls without ``gas_pvt`` are bit-identical. Example (THP 1000 psia, 5 MMscf/d, 100 bbl/d water, 5000 ft of 2.441 in tubing, 80-200 degF, SG 0.65), Beggs-Brill BHP: 1475.3 psia before, 1459.3 with ``GasPVT(sg=0.65)`` (DAK/PMC), 1508.2 with ``zmethod='BNS'``; WG 1444.8, 1444.1, 1446.2. Beggs-Brill moves most because the distributed-to-segregated boundary sits mid-well here and the gradient steps 27% across it. The pure-Python fallback is about 15 times slower with a ``gas_pvt`` (about 40 ms per ``fbhp``), since each step calls ``gas_z`` and ``gas_ug``. No documented example passes a ``gas_pvt`` to the VLP functions, so none moves; one nodal test that asserted a sweet ``GasPVT`` equals the ``gsg``-only answer now compares an HY/SUT ``GasPVT`` (within 4e-5).
|
|
@@ -152,6 +152,8 @@ pyrestoolbox.simtools.influence_tables
|
|
|
152
152
|
|
|
153
153
|
Solves Van Everdingin & Hurst Constant Terminal Rate solution via inverse Laplace transform and optionally writes out ECLIPSE styled AQUTAB include file.
|
|
154
154
|
|
|
155
|
+
The Rust extension (in every prebuilt wheel) does the inversion with no extra packages, using all available CPU threads; set the environment variable ``RAYON_NUM_THREADS`` before importing pyrestoolbox to limit them (for example ``RAYON_NUM_THREADS=1`` when running several processes side by side). The result does not depend on the thread count. Without it, the pure-Python fallback needs the optional ``aquifer`` extra (``ilt-inversion``, ``mpmath``, ``gmpy2``): ``pip install 'pyrestoolbox[aquifer]'``. Calling ``influence_tables`` on the pure-Python path without them raises ``ImportError``.
|
|
156
|
+
|
|
155
157
|
Returns a tuple of;
|
|
156
158
|
1. Dimensionless time list
|
|
157
159
|
2. list of lists of dimensionless pressures at each dimensionless time for each dimensionless radius
|
|
@@ -30,8 +30,6 @@ from typing import Union, Tuple
|
|
|
30
30
|
import numpy as np
|
|
31
31
|
import numpy.typing as npt
|
|
32
32
|
from tabulate import tabulate
|
|
33
|
-
from ilt import gwr
|
|
34
|
-
from mpmath import mp
|
|
35
33
|
|
|
36
34
|
from pyrestoolbox._accelerator import RUST_AVAILABLE, _rust_module
|
|
37
35
|
|
|
@@ -74,7 +72,17 @@ def influence_tables(
|
|
|
74
72
|
if RUST_AVAILABLE:
|
|
75
73
|
pDs = _rust_module.influence_tables_rust(tD.tolist(), list(ReDs), M)
|
|
76
74
|
else:
|
|
77
|
-
# Python fallback via ilt library
|
|
75
|
+
# Python fallback via ilt library (optional extra: pyrestoolbox[aquifer])
|
|
76
|
+
try:
|
|
77
|
+
from ilt import gwr
|
|
78
|
+
from mpmath import mp
|
|
79
|
+
except ImportError as e:
|
|
80
|
+
raise ImportError(
|
|
81
|
+
"influence_tables needs the Rust extension or the optional "
|
|
82
|
+
"inverse-Laplace dependencies; install them with "
|
|
83
|
+
"pip install 'pyrestoolbox[aquifer]'"
|
|
84
|
+
) from e
|
|
85
|
+
|
|
78
86
|
def laplace_Ps(s: float, ReD: float):
|
|
79
87
|
x = mp.sqrt(s)
|
|
80
88
|
# pre-calculate duplicated bessel function for greater efficiency
|