diff --git a/README.md b/README.md index 73d48b5..b400796 100644 --- a/README.md +++ b/README.md @@ -95,13 +95,9 @@ source my_venv/bin/activate # Install in-place (-e, editable) from ./meanas, including development dependencies ([dev]) pip3 install --user -e './meanas[dev]' -# Fast local iteration: excludes slower 3D/integration/example-smoke checks +# Run tests cd meanas -python3 -m pytest -q -m "not complete" - -# Complete pre-commit confidence run: includes the slower integration tests and -# tracked example smoke tests -python3 -m pytest -q | tee test_results.txt +python3 -m pytest -rsxX | tee test_results.txt ``` #### See also: diff --git a/meanas/fdfd/eme.py b/meanas/fdfd/eme.py index 366de8e..5165ef1 100644 --- a/meanas/fdfd/eme.py +++ b/meanas/fdfd/eme.py @@ -1,24 +1,3 @@ -""" -Low-level mode-matching helpers for waveguide / EME workflows. - -These helpers operate on already-solved and already-normalized port fields. -They do not build geometries or solve modes themselves; downstream users are -expected to supply compatible `(E, H)` modal field pairs from -`waveguide_2d`, `waveguide_3d`, or `waveguide_cyl`. - -The returned matrices follow the usual port ordering: - -- `get_tr(...)` returns `(T, R)` for left-incident modes. -- `get_abcd(...)` returns the 2-port block transfer matrix built from the two - directional `T/R` solves. -- `get_s(...)` returns the full block scattering matrix - `[[R12, T12], [T21, R21]]`. - -This module is intentionally a thin library layer rather than an integrated -simulation suite. It provides the overlap algebra that downstream users can -compose into larger workflows. -""" - from collections.abc import Sequence import numpy from numpy.typing import NDArray @@ -28,37 +7,6 @@ from ..fdmath import dx_lists2_t, vcfdfield2 from .waveguide_2d import inner_product -def _validate_port_modes( - name: str, - ehs: Sequence[Sequence[vcfdfield2]], - wavenumbers: Sequence[complex], - ) -> tuple[tuple[int, ...], tuple[int, ...]]: - if len(ehs) != len(wavenumbers): - raise ValueError(f'{name} mode list and wavenumber list must have the same length') - if not ehs: - raise ValueError(f'{name} must contain at least one mode') - - e_shape: tuple[int, ...] | None = None - h_shape: tuple[int, ...] | None = None - for index, mode in enumerate(ehs): - if len(mode) != 2: - raise ValueError(f'{name}[{index}] must be a 2-tuple of (E, H) modal fields') - e_field, h_field = mode - mode_e_shape = numpy.shape(e_field) - mode_h_shape = numpy.shape(h_field) - if mode_e_shape != mode_h_shape: - raise ValueError(f'{name}[{index}] has mismatched E/H field shapes') - if e_shape is None: - e_shape = mode_e_shape - h_shape = mode_h_shape - elif mode_e_shape != e_shape or mode_h_shape != h_shape: - raise ValueError(f'{name} modal fields must all share the same shape') - - assert e_shape is not None - assert h_shape is not None - return e_shape, h_shape - - def get_tr( ehLs: Sequence[Sequence[vcfdfield2]], wavenumbers_L: Sequence[complex], @@ -66,29 +14,6 @@ def get_tr( wavenumbers_R: Sequence[complex], dxes: dx_lists2_t, ) -> tuple[NDArray[numpy.complex128], NDArray[numpy.complex128]]: - """ - Compute left-incident transmission and reflection matrices. - - Args: - ehLs: Left-port modes as `(E, H)` field pairs. - wavenumbers_L: Propagation constants for `ehLs`. - ehRs: Right-port modes as `(E, H)` field pairs. - wavenumbers_R: Propagation constants for `ehRs`. - dxes: Two-dimensional Yee-cell edge lengths for the shared port plane. - - Returns: - `(T12, R12)` where columns index left-incident modes and rows index - outgoing right-going / left-going modes respectively. - - Raises: - ValueError: If the port mode lists are empty, malformed, or defined on - incompatible field shapes. - """ - left_e_shape, left_h_shape = _validate_port_modes('ehLs', ehLs, wavenumbers_L) - right_e_shape, right_h_shape = _validate_port_modes('ehRs', ehRs, wavenumbers_R) - if left_e_shape != right_e_shape or left_h_shape != right_h_shape: - raise ValueError('left and right modal fields must share the same E/H shapes') - nL = len(wavenumbers_L) nR = len(wavenumbers_R) A12 = numpy.zeros((nL, nR), dtype=complex) @@ -123,16 +48,6 @@ def get_abcd( wavenumbers_R: Sequence[complex], **kwargs, ) -> sparse.sparray: - """ - Build the 2-port block transfer matrix for an interface. - - The blocks are assembled from the forward and reverse `get_tr(...)` - solutions using the standard - - `[[A, B], [C, D]] = [[T12 - R21 T21^-1 R12, R21 T21^-1], [-T21^-1 R12, T21^-1]]` - - convention. - """ t12, r12 = get_tr(ehLs, wavenumbers_L, ehRs, wavenumbers_R, **kwargs) t21, r21 = get_tr(ehRs, wavenumbers_R, ehLs, wavenumbers_L, **kwargs) t21i = numpy.linalg.pinv(t21) @@ -158,19 +73,6 @@ def get_s( force_reciprocal: bool = False, **kwargs, ) -> NDArray[numpy.complex128]: - """ - Build the full block scattering matrix for a two-sided interface. - - The returned matrix is ordered as `[[R12, T12], [T21, R21]]`, where the - first block-row/column corresponds to the left port and the second to the - right port. - - Args: - force_nogain: If `True`, clamp singular values of the assembled - scattering matrix to at most one. - force_reciprocal: If `True`, symmetrize the assembled matrix as - `0.5 * (S + S.T)`. - """ t12, r12 = get_tr(ehLs, wavenumbers_L, ehRs, wavenumbers_R, **kwargs) t21, r21 = get_tr(ehRs, wavenumbers_R, ehLs, wavenumbers_L, **kwargs) diff --git a/meanas/test/test_eme_numerics.py b/meanas/test/test_eme_numerics.py index 7486128..8798e0d 100644 --- a/meanas/test/test_eme_numerics.py +++ b/meanas/test/test_eme_numerics.py @@ -1,9 +1,8 @@ import numpy -import pytest from scipy import sparse from ..fdmath import vec -from ..fdfd import eme, waveguide_2d, waveguide_cyl +from ..fdfd import eme from ._test_builders import complex_ramp, unit_dxes from .utils import assert_close @@ -12,8 +11,6 @@ SHAPE = (3, 2, 2) DXES = unit_dxes((2, 2)) WAVENUMBERS_L = numpy.array([1.0, 0.8]) WAVENUMBERS_R = numpy.array([0.9, 0.7]) -OMEGA = 1 / 1500 -REAL_DXES = unit_dxes((5, 5)) def _mode(scale: float) -> tuple[numpy.ndarray, numpy.ndarray]: @@ -133,102 +130,3 @@ def test_get_s_force_nogain_and_reciprocal_returns_finite_output(monkeypatch) -> assert numpy.isfinite(ss).all() assert_close(ss, ss.T) assert (numpy.linalg.svd(ss, compute_uv=False) <= 1.0 + 1e-12).all() - - -def test_get_tr_rejects_length_mismatches() -> None: - left_modes, right_modes = _mode_sets() - - with pytest.raises(ValueError, match='same length'): - eme.get_tr(left_modes[:1], WAVENUMBERS_L, right_modes, WAVENUMBERS_R, dxes=DXES) - - -def test_get_tr_rejects_malformed_mode_tuples() -> None: - bad_modes = [(numpy.ones(4),)] - - with pytest.raises(ValueError, match='2-tuple'): - eme.get_tr(bad_modes, [1.0], bad_modes, [1.0], dxes=DXES) - - -def test_get_tr_rejects_incompatible_field_shapes() -> None: - left_modes = [(numpy.ones(4), numpy.ones(4))] - right_modes = [(numpy.ones(6), numpy.ones(6))] - - with pytest.raises(ValueError, match='same E/H shapes'): - eme.get_tr(left_modes, [1.0], right_modes, [1.0], dxes=DXES) - - -def _build_real_epsilon() -> numpy.ndarray: - epsilon = numpy.ones((3, 5, 5), dtype=float) - epsilon[:, 2, 1] = 2.0 - return vec(epsilon) - - -def _build_straight_mode() -> tuple[tuple[numpy.ndarray, numpy.ndarray], complex, numpy.ndarray]: - epsilon = _build_real_epsilon() - e_xy, wavenumber = waveguide_2d.solve_mode( - 0, - omega=OMEGA, - dxes=REAL_DXES, - epsilon=epsilon, - ) - e_field, h_field = waveguide_2d.normalized_fields_e( - e_xy, - wavenumber=wavenumber, - omega=OMEGA, - dxes=REAL_DXES, - epsilon=epsilon, - ) - return (e_field, h_field), wavenumber, epsilon - - -def _build_bend_mode() -> tuple[tuple[numpy.ndarray, numpy.ndarray], complex]: - epsilon = vec(numpy.ones((3, 5, 5), dtype=float)) - rmin = 10.0 - e_xy, angular_wavenumber = waveguide_cyl.solve_mode( - 0, - omega=OMEGA, - dxes=REAL_DXES, - epsilon=epsilon, - rmin=rmin, - ) - linear_wavenumber = waveguide_cyl.linear_wavenumbers( - [e_xy], - [angular_wavenumber], - epsilon=epsilon, - dxes=REAL_DXES, - rmin=rmin, - )[0] - e_field, h_field = waveguide_cyl.normalized_fields_e( - e_xy, - angular_wavenumber=angular_wavenumber, - omega=OMEGA, - dxes=REAL_DXES, - epsilon=epsilon, - rmin=rmin, - ) - return (e_field, h_field), linear_wavenumber - - -def test_get_s_is_near_identity_for_identical_solved_straight_modes() -> None: - mode, wavenumber, _epsilon = _build_straight_mode() - - ss = eme.get_s([mode], [wavenumber], [mode], [wavenumber], dxes=REAL_DXES) - - assert ss.shape == (2, 2) - assert numpy.isfinite(ss).all() - assert abs(ss[0, 0]) < 1e-6 - assert abs(ss[1, 1]) < 1e-6 - assert abs(abs(ss[0, 1]) - 1.0) < 1e-6 - assert abs(abs(ss[1, 0]) - 1.0) < 1e-6 - assert numpy.linalg.svd(ss, compute_uv=False).max() <= 1.0 + 1e-10 - - -def test_get_s_returns_finite_passive_output_for_small_straight_to_bend_fixture() -> None: - straight_mode, straight_wavenumber, _epsilon = _build_straight_mode() - bend_mode, bend_wavenumber = _build_bend_mode() - - ss = eme.get_s([straight_mode], [straight_wavenumber], [bend_mode], [bend_wavenumber], dxes=REAL_DXES) - - assert ss.shape == (2, 2) - assert numpy.isfinite(ss).all() - assert numpy.linalg.svd(ss, compute_uv=False).max() <= 1.0 + 1e-10 diff --git a/meanas/test/test_examples_smoke.py b/meanas/test/test_examples_smoke.py deleted file mode 100644 index b21f90b..0000000 --- a/meanas/test/test_examples_smoke.py +++ /dev/null @@ -1,47 +0,0 @@ -from pathlib import Path -import os -import subprocess -import sys - -import pytest - - -pytestmark = pytest.mark.complete - -REPO_ROOT = Path(__file__).resolve().parents[2] - - -def _run_example(example_name: str, tmp_path: Path) -> subprocess.CompletedProcess[str]: - env = os.environ.copy() - env['MPLBACKEND'] = 'Agg' - env['MPLCONFIGDIR'] = str(tmp_path / f'mpl-{example_name}') - return subprocess.run( - [sys.executable, str(REPO_ROOT / 'examples' / example_name)], - cwd=REPO_ROOT, - env=env, - text=True, - capture_output=True, - check=False, - timeout=60, - ) - - -def test_eme_example_smoke_runs(tmp_path: Path) -> None: - pytest.importorskip('matplotlib') - - result = _run_example('eme.py', tmp_path) - - assert result.returncode == 0, result.stdout + result.stderr - assert 'left effective indices:' in result.stdout - assert 'fundamental left-to-right transmission' in result.stdout - - -def test_eme_bend_example_smoke_runs(tmp_path: Path) -> None: - pytest.importorskip('matplotlib') - pytest.importorskip('skrf') - - result = _run_example('eme_bend.py', tmp_path) - - assert result.returncode == 0, result.stdout + result.stderr - assert 'straight effective indices:' in result.stdout - assert 'cascaded bend through power' in result.stdout diff --git a/meanas/test/test_fdtd_pml.py b/meanas/test/test_fdtd_pml.py index 06c2588..9d8aef8 100644 --- a/meanas/test/test_fdtd_pml.py +++ b/meanas/test/test_fdtd_pml.py @@ -198,7 +198,6 @@ def test_cpml_plane_wave_phasor_decays_monotonically_through_outgoing_pml() -> N assert numpy.all(numpy.diff(right_pml) <= interior_level * 1e-3) -@pytest.mark.complete def test_cpml_point_source_total_energy_reaches_late_time_plateau() -> None: dt = 0.3 period_steps = 24 diff --git a/meanas/test/test_import_fallbacks.py b/meanas/test/test_import_fallbacks.py index 75005d0..d1ecca9 100644 --- a/meanas/test/test_import_fallbacks.py +++ b/meanas/test/test_import_fallbacks.py @@ -17,7 +17,6 @@ def _restore_reloaded(monkeypatch, module): def test_meanas_import_survives_readme_open_failure(monkeypatch) -> None: # type: ignore[no-untyped-def] - expected_version = meanas.__version__ original_open = pathlib.Path.open def failing_open(self: pathlib.Path, *args, **kwargs): # type: ignore[no-untyped-def] @@ -28,7 +27,7 @@ def test_meanas_import_survives_readme_open_failure(monkeypatch) -> None: # typ monkeypatch.setattr(pathlib.Path, 'open', failing_open) reloaded = _reload(meanas) - assert reloaded.__version__ == expected_version + assert reloaded.__version__ == '0.10' assert reloaded.__author__ == 'Jan Petykiewicz' assert reloaded.__doc__ is not None diff --git a/meanas/test/test_waveguide_fdtd_fdfd.py b/meanas/test/test_waveguide_fdtd_fdfd.py index ae2078d..167b91e 100644 --- a/meanas/test/test_waveguide_fdtd_fdfd.py +++ b/meanas/test/test_waveguide_fdtd_fdfd.py @@ -2,7 +2,6 @@ import dataclasses from functools import lru_cache import numpy -import pytest from .. import fdfd, fdtd from ..fdtd.misc import gaussian_packet @@ -10,9 +9,6 @@ from ..fdmath import vec, unvec from ..fdfd import functional, scpml, waveguide_3d -pytestmark = pytest.mark.complete - - DT = 0.25 PERIOD_STEPS = 64 OMEGA = 2 * numpy.pi / (PERIOD_STEPS * DT) diff --git a/pyproject.toml b/pyproject.toml index 55fcac1..013631a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -121,9 +121,6 @@ ignore_missing_imports = true [tool.pytest.ini_options] addopts = "-rsXx" testpaths = ["meanas"] -markers = [ - "complete: slower integration and smoke tests intended for full pre-commit confidence runs", -] [tool.coverage.run] source = ["meanas"] diff --git a/uv.lock b/uv.lock index 08bad0c..b696160 100644 --- a/uv.lock +++ b/uv.lock @@ -1,13 +1,5 @@ version = 1 requires-python = ">=3.11" -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version < '3.14' and sys_platform == 'emscripten'", - "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] [[package]] name = "babel" @@ -738,8 +730,8 @@ dependencies = [ [package.optional-dependencies] dev = [ { name = "coverage" }, + { name = "gridlock" }, { name = "htmlark" }, - { name = "matplotlib" }, { name = "mkdocs" }, { name = "mkdocs-material" }, { name = "mkdocs-print-site-plugin" }, @@ -747,7 +739,6 @@ dev = [ { name = "pymdown-extensions" }, { name = "pytest" }, { name = "ruff" }, - { name = "scikit-rf" }, ] docs = [ { name = "htmlark" }, @@ -759,8 +750,8 @@ docs = [ { name = "ruff" }, ] examples = [ + { name = "gridlock" }, { name = "matplotlib" }, - { name = "scikit-rf" }, ] test = [ { name = "coverage" }, @@ -771,10 +762,11 @@ test = [ requires-dist = [ { name = "coverage", marker = "extra == 'dev'" }, { name = "coverage", marker = "extra == 'test'" }, - { name = "gridlock", specifier = ">=2.1" }, + { name = "gridlock" }, + { name = "gridlock", marker = "extra == 'dev'" }, + { name = "gridlock", marker = "extra == 'examples'", specifier = ">=2.1" }, { name = "htmlark", marker = "extra == 'dev'", specifier = ">=1.0" }, { name = "htmlark", marker = "extra == 'docs'", specifier = ">=1.0" }, - { name = "matplotlib", marker = "extra == 'dev'", specifier = ">=3.10.8" }, { name = "matplotlib", marker = "extra == 'examples'", specifier = ">=3.10.8" }, { name = "mkdocs", marker = "extra == 'dev'", specifier = ">=1.6" }, { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6" }, @@ -791,8 +783,6 @@ requires-dist = [ { name = "pytest", marker = "extra == 'test'" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6" }, { name = "ruff", marker = "extra == 'docs'", specifier = ">=0.6" }, - { name = "scikit-rf", marker = "extra == 'dev'", specifier = ">=1.0" }, - { name = "scikit-rf", marker = "extra == 'examples'", specifier = ">=1.0" }, { name = "scipy", specifier = "~=1.14" }, ] @@ -1035,66 +1025,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, ] -[[package]] -name = "pandas" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "python-dateutil" }, - { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0", size = 10326926 }, - { url = "https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c", size = 9926987 }, - { url = "https://files.pythonhosted.org/packages/52/77/9b1c2d6070b5dbe239a7bc889e21bfa58720793fb902d1e070695d87c6d0/pandas-3.0.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:339dda302bd8369dedeae979cb750e484d549b563c3f54f3922cb8ff4978c5eb", size = 10757067 }, - { url = "https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76", size = 11258787 }, - { url = "https://files.pythonhosted.org/packages/90/e3/3f1126d43d3702ca8773871a81c9f15122a1f412342cc56284ffda5b1f70/pandas-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c934008c733b8bbea273ea308b73b3156f0181e5b72960790b09c18a2794fe1e", size = 11771616 }, - { url = "https://files.pythonhosted.org/packages/2e/cf/0f4e268e1f5062e44a6bda9f925806721cd4c95c2b808a4c82ebe914f96b/pandas-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:60a80bb4feacbef5e1447a3f82c33209c8b7e07f28d805cfd1fb951e5cb443aa", size = 12337623 }, - { url = "https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df", size = 9897372 }, - { url = "https://files.pythonhosted.org/packages/8f/eb/781516b808a99ddf288143cec46b342b3016c3414d137da1fdc3290d8860/pandas-3.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f12b1a9e332c01e09510586f8ca9b108fd631fd656af82e452d7315ef6df5f9f", size = 9154922 }, - { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921 }, - { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127 }, - { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577 }, - { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030 }, - { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468 }, - { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381 }, - { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993 }, - { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118 }, - { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105 }, - { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088 }, - { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066 }, - { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780 }, - { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181 }, - { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899 }, - { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574 }, - { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156 }, - { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238 }, - { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520 }, - { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154 }, - { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449 }, - { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475 }, - { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568 }, - { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652 }, - { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084 }, - { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146 }, - { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081 }, - { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535 }, - { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992 }, - { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257 }, - { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893 }, - { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644 }, - { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246 }, - { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801 }, - { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643 }, - { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641 }, - { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993 }, - { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274 }, - { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530 }, - { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341 }, -] - [[package]] name = "pathspec" version = "1.0.4" @@ -1375,21 +1305,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/b6/aeadee5443e49baa2facd51131159fd6301cc4ccfc1541e4df7b021c37dd/ruff-0.15.11-py3-none-win_arm64.whl", hash = "sha256:063fed18cc1bbe0ee7393957284a6fe8b588c6a406a285af3ee3f46da2391ee4", size = 11032614 }, ] -[[package]] -name = "scikit-rf" -version = "1.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "pandas" }, - { name = "scipy" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/89/bb/36d5d359137435e1776c44aaf5861aa84727ad728ac979ec76a52e3e5b28/scikit_rf-1.11.0.tar.gz", hash = "sha256:ac6c532e327da473abb15864105337424061a9d36429808362de0247eb2906d1", size = 577744 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/53/301380bcb71e136d944363f9172491730ad3f03d0cef598d57a65db38d84/scikit_rf-1.11.0-py3-none-any.whl", hash = "sha256:a8e7c8e3b89630685b1e1ab4c48fe19a6f830bbf31c26cd6f438e90902c2b9c5", size = 627060 }, -] - [[package]] name = "scipy" version = "1.16.3" @@ -1488,15 +1403,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, ] -[[package]] -name = "tzdata" -version = "2026.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952 }, -] - [[package]] name = "urllib3" version = "2.6.3"