From 70a46a7d558aaff1076d748eb68157b610502f91 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Mon, 24 Nov 2025 10:41:35 -0500 Subject: [PATCH 01/14] Allow for calving in dynamical spinup --- poetry.lock | 281 ++++++++++++++++++++++++++----- pygem/bin/run/run_calibration.py | 10 +- pygem/bin/run/run_spinup.py | 79 ++++++--- pyproject.toml | 2 +- 4 files changed, 300 insertions(+), 72 deletions(-) diff --git a/poetry.lock b/poetry.lock index 47e6d211..c9fd665e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "affine" @@ -6,6 +6,7 @@ version = "2.4.0" description = "Matrices describing affine transformation of the plane" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92"}, {file = "affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea"}, @@ -21,6 +22,7 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -34,7 +36,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] trio = ["trio (>=0.26.1)"] [[package]] @@ -43,6 +45,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "platform_system == \"Darwin\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -54,6 +58,7 @@ version = "23.1.0" description = "Argon2 for Python" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, @@ -74,6 +79,7 @@ version = "21.2.0" description = "Low-level CFFI bindings for Argon2" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, @@ -111,6 +117,7 @@ version = "1.3.0" description = "Better dates & times for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, @@ -130,6 +137,7 @@ version = "0.20.0" description = "Exploratory analysis of Bayesian models" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "arviz-0.20.0-py3-none-any.whl", hash = "sha256:5ec4f2ec180a8305ff3d1108c29e189944ab939663eb5bc3231ff199a1a5dc36"}, {file = "arviz-0.20.0.tar.gz", hash = "sha256:a2704e0c141410fcaea1973a90cabf280f5aed5c1e10f44381ebd6c144c10a9c"}, @@ -157,6 +165,7 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -172,6 +181,7 @@ version = "2.0.4" description = "Simple LRU cache for asyncio" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, @@ -186,18 +196,19 @@ version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "babel" @@ -205,13 +216,14 @@ version = "2.17.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.extras] -dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] [[package]] name = "beautifulsoup4" @@ -219,6 +231,7 @@ version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" +groups = ["main"] files = [ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, @@ -240,6 +253,7 @@ version = "6.2.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, @@ -258,6 +272,7 @@ version = "2.7.1" description = "Python wrapper for the C-Blosc2 library" optional = false python-versions = "<4,>=3.10" +groups = ["main"] files = [ {file = "blosc2-2.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ad698c6fca8dee677b7a1881206f7ac43ffd7c458733716a3de1e1f3c6ba1f79"}, {file = "blosc2-2.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5923a22fb7cfdad571b316930e8812618ba8b2ac1f37ac05edcf3eda71beed9f"}, @@ -296,6 +311,7 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -307,6 +323,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -386,6 +403,7 @@ version = "1.6.4.post1" description = "Time-handling functionality from netcdf4-python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cftime-1.6.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0baa9bc4850929da9f92c25329aa1f651e2d6f23e237504f337ee9e12a769f5d"}, {file = "cftime-1.6.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bb6b087f4b2513c37670bccd457e2a666ca489c5f2aad6e2c0e94604dc1b5b9"}, @@ -437,6 +455,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -538,6 +557,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -552,6 +572,7 @@ version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, @@ -569,6 +590,7 @@ version = "0.7.2" description = "Click params for commmand line interfaces to GeoJSON" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +groups = ["main"] files = [ {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, @@ -586,6 +608,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -597,6 +621,7 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -614,6 +639,7 @@ version = "5.0.9" description = "Config file reading, writing and validation." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "configobj-5.0.9.tar.gz", hash = "sha256:03c881bbf23aa07bccf1b837005975993c4ab4427ba57f959afdd9d1a2386848"}, ] @@ -624,6 +650,7 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -697,6 +724,7 @@ version = "7.7.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "coverage-7.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a538a23119d1e2e2ce077e902d02ea3d8e0641786ef6e0faf11ce82324743944"}, {file = "coverage-7.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1586ad158523f4133499a4f322b230e2cfef9cc724820dbd58595a5a236186f4"}, @@ -767,7 +795,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cycler" @@ -775,6 +803,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -790,6 +819,7 @@ version = "1.8.12" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "debugpy-1.8.12-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:a2ba7ffe58efeae5b8fad1165357edfe01464f9aef25e814e891ec690e7dd82a"}, {file = "debugpy-1.8.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbbd4149c4fc5e7d508ece083e78c17442ee13b0e69bfa6bd63003e486770f45"}, @@ -825,6 +855,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -836,6 +867,7 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -847,6 +879,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -861,13 +895,14 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "fastjsonschema" @@ -875,6 +910,7 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -889,6 +925,7 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -897,7 +934,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "fonttools" @@ -905,6 +942,7 @@ version = "4.55.8" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fonttools-4.55.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d11600f5343092697d7434f3bf77a393c7ae74be206fe30e577b9a195fd53165"}, {file = "fonttools-4.55.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c96f2506ce1a0beeaa9595f9a8b7446477eb133f40c0e41fc078744c28149f80"}, @@ -959,18 +997,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "fqdn" @@ -978,6 +1016,7 @@ version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["main"] files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, @@ -989,6 +1028,7 @@ version = "2025.2.0" description = "File-system specification" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"}, {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"}, @@ -1028,6 +1068,7 @@ version = "1.0.1" description = "Geographic pandas extensions" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "geopandas-1.0.1-py3-none-any.whl", hash = "sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6"}, {file = "geopandas-1.0.1.tar.gz", hash = "sha256:b8bf70a5534588205b7a56646e2082fb1de9a03599651b3d80c99ea4c2ca08ab"}, @@ -1051,6 +1092,7 @@ version = "1.14" description = "An implementation of Gaussian Processes in Pytorch" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "gpytorch-1.14-py3-none-any.whl", hash = "sha256:9b17ff7bd70dc39c3a3c03eb2bb9a87aa4b840c26e71ac68d120b96487bf5a12"}, {file = "gpytorch-1.14.tar.gz", hash = "sha256:032cc11e6a46e1e4bc7763fcef318cc830aceaea85a7289f27b2288c7a339a8d"}, @@ -1077,6 +1119,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1088,6 +1131,7 @@ version = "1.5.0" description = "netCDF4 via h5py" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "h5netcdf-1.5.0-py3-none-any.whl", hash = "sha256:1baca17d395e14cd06899d0334385c9a27e86baa4c6ff2fc51ac44fd210fd843"}, {file = "h5netcdf-1.5.0.tar.gz", hash = "sha256:9d6c28147677bd075787881aadb24d2fdb0bc0319481bcb5d2a54dc4b94c4ba9"}, @@ -1106,6 +1150,7 @@ version = "3.12.1" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "h5py-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda"}, {file = "h5py-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3"}, @@ -1144,6 +1189,7 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1165,6 +1211,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1177,7 +1224,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -1189,6 +1236,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1203,6 +1251,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1214,6 +1263,7 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -1247,6 +1297,7 @@ version = "8.32.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa"}, {file = "ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251"}, @@ -1268,7 +1319,7 @@ typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1285,6 +1336,7 @@ version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -1306,6 +1358,7 @@ version = "20.11.0" description = "Operations with ISO 8601 durations" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, @@ -1320,6 +1373,7 @@ version = "0.2.37" description = "Type annotations and runtime checking for shape and dtype of JAX/NumPy/PyTorch/etc. arrays." optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "jaxtyping-0.2.37-py3-none-any.whl", hash = "sha256:519f694ce569ba5000a1f8823e742df2d86e6da3956d2218769b6bdc5ad2d23a"}, {file = "jaxtyping-0.2.37.tar.gz", hash = "sha256:ae8c124abbea61b8c56455fb8b42f1183ab63353572aedfb1de355bb5b40e951"}, @@ -1334,6 +1388,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1353,6 +1408,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1370,6 +1426,7 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -1381,6 +1438,7 @@ version = "0.10.0" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, @@ -1395,6 +1453,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1406,6 +1465,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -1435,6 +1495,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -1449,6 +1510,7 @@ version = "1.1.1" description = "Jupyter metapackage. Install all the Jupyter components in one go." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, @@ -1468,6 +1530,7 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, @@ -1482,7 +1545,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" @@ -1490,6 +1553,7 @@ version = "6.6.3" description = "Jupyter terminal console" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, @@ -1514,6 +1578,7 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, @@ -1534,6 +1599,7 @@ version = "0.11.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf"}, {file = "jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90"}, @@ -1559,6 +1625,7 @@ version = "2.2.5" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, @@ -1573,6 +1640,7 @@ version = "2.15.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3"}, {file = "jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084"}, @@ -1609,6 +1677,7 @@ version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, @@ -1628,6 +1697,7 @@ version = "4.3.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyterlab-4.3.5-py3-none-any.whl", hash = "sha256:571bbdee20e4c5321ab5195bc41cf92a75a5cff886be5e57ce78dfa37a5e9fdb"}, {file = "jupyterlab-4.3.5.tar.gz", hash = "sha256:c779bf72ced007d7d29d5bcef128e7fdda96ea69299e19b04a43635a7d641f9d"}, @@ -1662,6 +1732,7 @@ version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -1673,6 +1744,7 @@ version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, @@ -1698,6 +1770,7 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"}, {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"}, @@ -1709,6 +1782,7 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -1798,6 +1872,7 @@ version = "0.6" description = "A linear operator implementation, primarily designed for finite-dimensional positive definite operators (i.e. kernel matrices)." optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "linear_operator-0.6-py3-none-any.whl", hash = "sha256:b7c30ce0f6599e19c1cb970e00811828df98783b20c1dd2f765928415012f41c"}, {file = "linear_operator-0.6.tar.gz", hash = "sha256:a9e2663879f1a2b28631bf7ef34892c4e5749893e711c8ef0ab0a39aff70a654"}, @@ -1820,6 +1895,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -1890,6 +1966,7 @@ version = "3.10.0" description = "Python plotting package" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, @@ -1947,6 +2024,7 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -1961,6 +2039,7 @@ version = "3.1.1" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "mistune-3.1.1-py3-none-any.whl", hash = "sha256:02106ac2aa4f66e769debbfa028509a275069dcffce0dfa578edd7b991ee700a"}, {file = "mistune-3.1.1.tar.gz", hash = "sha256:e0740d635f515119f7d1feb6f9b192ee60f0cc649f80a8f944f905706a21654c"}, @@ -1975,6 +2054,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -1983,7 +2063,7 @@ files = [ [package.extras] develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] +gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] tests = ["pytest (>=4.6)"] [[package]] @@ -1992,6 +2072,7 @@ version = "1.1.0" description = "MessagePack serializer" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, @@ -2065,6 +2146,7 @@ version = "0.10.2" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.9.0" +groups = ["main"] files = [ {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, @@ -2087,6 +2169,7 @@ version = "7.16.6" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b"}, {file = "nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582"}, @@ -2123,6 +2206,7 @@ version = "5.10.4" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, @@ -2144,6 +2228,7 @@ version = "1.5.5" description = "Pytest plugin for testing notebooks" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "nbmake-1.5.5-py3-none-any.whl", hash = "sha256:c6fbe6e48b60cacac14af40b38bf338a3b88f47f085c54ac5b8639ff0babaf4b"}, {file = "nbmake-1.5.5.tar.gz", hash = "sha256:239dc868ea13a7c049746e2aba2c229bd0f6cdbc6bfa1d22f4c88638aa4c5f5c"}, @@ -2162,6 +2247,7 @@ version = "1.9.2" description = "A Python library for manipulating indices of ndarrays." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "ndindex-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6c0bd9fb02b5ac6e3e8b70404930e1f6824ad565363bf8f0e817d6f6a3a47593"}, {file = "ndindex-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3502df515c225e653b55fc08e714d4ae56306ad46454759d90156530cb4e2f40"}, @@ -2225,6 +2311,7 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -2236,6 +2323,7 @@ version = "1.7.2" description = "Provides an object-oriented python interface to the netCDF version 4 library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "netCDF4-1.7.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:5e9b485e3bd9294d25ff7dc9addefce42b3d23c1ee7e3627605277d159819392"}, {file = "netCDF4-1.7.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:118b476fd00d7e3ab9aa7771186d547da645ae3b49c0c7bdab866793ebf22f07"}, @@ -2283,6 +2371,7 @@ version = "3.4.2" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, @@ -2302,6 +2391,7 @@ version = "7.3.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288"}, {file = "notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8"}, @@ -2317,7 +2407,7 @@ tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0) ; python_version < \"3.10\"", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -2325,6 +2415,7 @@ version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, @@ -2342,6 +2433,7 @@ version = "2.10.2" description = "Fast numerical expression evaluator for NumPy" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "numexpr-2.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b0e82d2109c1d9e63fcd5ea177d80a11b881157ab61178ddbdebd4c561ea46"}, {file = "numexpr-2.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc2b8035a0c2cdc352e58c3875cb668836018065cbf5752cb531015d9a568d8"}, @@ -2390,6 +2482,7 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -2435,6 +2528,8 @@ version = "12.1.3.1" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, @@ -2446,6 +2541,8 @@ version = "12.1.105" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, @@ -2457,6 +2554,8 @@ version = "12.1.105" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, @@ -2468,6 +2567,8 @@ version = "12.1.105" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, @@ -2479,6 +2580,8 @@ version = "8.9.2.26" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, ] @@ -2492,6 +2595,8 @@ version = "11.0.2.54" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, @@ -2503,6 +2608,8 @@ version = "10.3.2.106" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, @@ -2514,6 +2621,8 @@ version = "11.4.5.107" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, @@ -2530,6 +2639,8 @@ version = "12.1.0.106" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, @@ -2544,6 +2655,8 @@ version = "2.19.3" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:a9734707a2c96443331c1e48c717024aa6678a0e2a4cb66b2c364d18cee6b48d"}, ] @@ -2554,6 +2667,8 @@ version = "12.8.61" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:45fd79f2ae20bd67e8bc411055939049873bfd8fac70ff13bd4865e0b9bdab17"}, {file = "nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b80ecab31085dda3ce3b41d043be0ec739216c3fc633b8abe212d5a30026df0"}, @@ -2566,6 +2681,8 @@ version = "12.1.105" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, @@ -2573,14 +2690,13 @@ files = [ [[package]] name = "oggm" -version = "1.6.2" +version = "1.6.3.dev26+g1c68657c4" description = "Open Global Glacier Model" optional = false python-versions = ">=3.6" -files = [ - {file = "oggm-1.6.2-py2.py3-none-any.whl", hash = "sha256:39159cfc19ce198cc50a5d0f84e35b276d9a696bf4f3fdd9b15f4636a673428e"}, - {file = "oggm-1.6.2.tar.gz", hash = "sha256:35eb945b78391b3b4cec23e93666982d466b04f26e994c6a03821e425d0e987b"}, -] +groups = ["main"] +files = [] +develop = false [package.dependencies] configobj = "*" @@ -2593,12 +2709,19 @@ scipy = "*" shapely = "*" xarray = "*" +[package.source] +type = "git" +url = "https://github.com/OGGM/oggm.git" +reference = "HEAD" +resolved_reference = "1c68657c43397efe7a1bb8e1f917854156dce8e2" + [[package]] name = "overrides" version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -2610,6 +2733,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2621,6 +2745,7 @@ version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, @@ -2707,6 +2832,7 @@ version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -2718,6 +2844,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -2733,6 +2860,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -2747,6 +2876,7 @@ version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, @@ -2826,7 +2956,7 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -2835,6 +2965,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2851,6 +2982,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2866,6 +2998,7 @@ version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, @@ -2880,6 +3013,7 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, @@ -2894,6 +3028,7 @@ version = "6.1.1" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, @@ -2924,6 +3059,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["main"] +markers = "os_name != \"nt\" or sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -2935,6 +3072,7 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -2949,6 +3087,7 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -2960,6 +3099,7 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -2971,6 +3111,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -2985,6 +3126,7 @@ version = "0.10.0" description = "Vectorized spatial vector file format I/O using GDAL/OGR" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyogrio-0.10.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:046eeeae12a03a3ebc3dc5ff5a87664e4f5fc0a4fb1ea5d5c45d547fa941072b"}, {file = "pyogrio-0.10.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:44380f4d9245c776f432526e29ce4d29238aea26adad991803c4f453474f51d3"}, @@ -3036,6 +3178,7 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3050,6 +3193,7 @@ version = "3.7.0" description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "pyproj-3.7.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d5c7e7d24b967e328a5efd013f466804a1f226d1106ac7efc47dcc99360dbc8f"}, {file = "pyproj-3.7.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:448958c46bd3fe2da91c89ba551ac5835e63073ca861422c6eb1af89979dfab1"}, @@ -3087,6 +3231,7 @@ version = "8.3.5" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, @@ -3109,6 +3254,7 @@ version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, @@ -3127,6 +3273,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3141,13 +3288,14 @@ version = "3.2.1" description = "JSON Log Formatter for the Python Logging Package" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090"}, {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"}, ] [package.extras] -dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "msgspec-python313-pre", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\" and python_version < \"3.13\"", "msgspec-python313-pre ; implementation_name != \"pypy\" and python_version == \"3.13\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] [[package]] name = "pytz" @@ -3155,6 +3303,7 @@ version = "2025.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, @@ -3166,6 +3315,8 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3193,6 +3344,8 @@ version = "2.0.14" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "os_name == \"nt\"" files = [ {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, @@ -3208,6 +3361,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3270,6 +3424,7 @@ version = "26.2.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pyzmq-26.2.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:f39d1227e8256d19899d953e6e19ed2ccb689102e6d85e024da5acf410f301eb"}, {file = "pyzmq-26.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a23948554c692df95daed595fdd3b76b420a4939d7a8a28d6d7dea9711878641"}, @@ -3391,6 +3546,7 @@ version = "1.4.3" description = "Fast and direct raster I/O for use with Numpy and SciPy" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rasterio-1.4.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:80f994b92e5dda78f13291710bd5c43efcfd164f69a8a2c20489115df9d178c8"}, {file = "rasterio-1.4.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1a6e6ca9ec361599b48c9918ce25adb1a9203b8c8ca9b34ad78dccb3aef7945a"}, @@ -3439,6 +3595,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -3455,6 +3612,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3476,6 +3634,7 @@ version = "0.1.4" description = "A pure python RFC3339 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, @@ -3490,6 +3649,7 @@ version = "0.1.1" description = "Pure python rfc3986 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -3501,6 +3661,7 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -3613,6 +3774,7 @@ version = "0.18.10" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1"}, {file = "ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58"}, @@ -3631,6 +3793,8 @@ version = "0.2.12" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "platform_python_implementation == \"CPython\"" files = [ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, @@ -3686,6 +3850,7 @@ version = "0.11.11" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092"}, {file = "ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4"}, @@ -3713,6 +3878,7 @@ version = "0.3.11" description = "Geoscientific data I/O and map projections" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "salem-0.3.11-py2.py3-none-any.whl", hash = "sha256:25d613cda1d6c907ece1316812791ce1e988e4b10ccb224e3b69ca46055154a8"}, {file = "salem-0.3.11.tar.gz", hash = "sha256:26574b9f9e3b6bb0a6423f3d0aa697e6d659e0916afc8010b07e7d578523e34a"}, @@ -3733,6 +3899,7 @@ version = "1.6.1" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e"}, {file = "scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36"}, @@ -3787,6 +3954,7 @@ version = "1.15.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, @@ -3836,7 +4004,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "send2trash" @@ -3844,15 +4012,16 @@ version = "1.8.3" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, ] [package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] +nativelib = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\"", "pywin32 ; sys_platform == \"win32\""] +objc = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\""] +win32 = ["pywin32 ; sys_platform == \"win32\""] [[package]] name = "setuptools" @@ -3860,19 +4029,20 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "shapely" @@ -3880,6 +4050,7 @@ version = "2.0.7" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, @@ -3938,6 +4109,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3949,6 +4121,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -3960,6 +4133,7 @@ version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, @@ -3971,6 +4145,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -3990,6 +4165,7 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -4007,6 +4183,7 @@ version = "3.10.1" description = "Hierarchical datasets for Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "tables-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca9d11a570ca1bc57f0845e54e55c3093d5a1ace376faee639e09503a73745b"}, {file = "tables-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b62881cb682438d1e92b9178db42b160638aef3ca23341f7d98e9b27821b1eb4"}, @@ -4043,6 +4220,7 @@ version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, @@ -4064,6 +4242,7 @@ version = "3.5.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, @@ -4075,6 +4254,7 @@ version = "1.4.0" description = "A tiny CSS parser" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, @@ -4093,6 +4273,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version == \"3.10\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4134,6 +4316,7 @@ version = "2.2.2" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "torch-2.2.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:bc889d311a855dd2dfd164daf8cc903a6b7273a747189cebafdd89106e4ad585"}, {file = "torch-2.2.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15dffa4cc3261fa73d02f0ed25f5fa49ecc9e12bf1ae0a4c1e7a88bbfaad9030"}, @@ -4192,6 +4375,7 @@ version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, @@ -4212,6 +4396,7 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -4233,6 +4418,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -4248,6 +4434,8 @@ version = "2.2.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version < \"3.12\" and platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ {file = "triton-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2294514340cfe4e8f4f9e5c66c702744c4a117d25e618bd08469d0bfed1e2e5"}, {file = "triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da58a152bddb62cafa9a857dd2bc1f886dbf9f9c90a2b5da82157cd2b34392b0"}, @@ -4271,6 +4459,7 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4282,6 +4471,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4293,6 +4483,7 @@ version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -4304,6 +4495,7 @@ version = "1.3.0" description = "RFC 6570 URI Template Processor" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -4318,13 +4510,14 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -4335,6 +4528,7 @@ version = "0.1.3" description = "A Wadler–Lindig pretty-printer for Python." optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "wadler_lindig-0.1.3-py3-none-any.whl", hash = "sha256:3018e4e6b115a7ef21c77414a41cbe7e03e83f6b5e25004958e33432a17f3c94"}, {file = "wadler_lindig-0.1.3.tar.gz", hash = "sha256:476fb7015135f714cef8f8eac7c44b164c8b993345e651a9b6f25b7b112440c9"}, @@ -4350,6 +4544,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -4361,6 +4556,7 @@ version = "24.11.1" description = "A library for working with the color formats defined by HTML and CSS." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, @@ -4372,6 +4568,7 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -4383,6 +4580,7 @@ version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -4399,6 +4597,7 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -4410,6 +4609,7 @@ version = "2024.11.0" description = "N-D labeled arrays and datasets in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "xarray-2024.11.0-py3-none-any.whl", hash = "sha256:6ee94f63ddcbdd0cf3909d1177f78cdac756640279c0e32ae36819a89cdaba37"}, {file = "xarray-2024.11.0.tar.gz", hash = "sha256:1ccace44573ddb862e210ad3ec204210654d2c750bec11bbe7d842dfc298591f"}, @@ -4425,7 +4625,7 @@ accel = ["bottleneck", "flox", "numba (>=0.54)", "numbagg", "opt_einsum", "scipy complete = ["xarray[accel,etc,io,parallel,viz]"] dev = ["hypothesis", "jinja2", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-env", "pytest-timeout", "pytest-xdist", "ruff", "sphinx", "sphinx_autosummary_accessors", "xarray[complete]"] etc = ["sparse"] -io = ["cftime", "fsspec", "h5netcdf", "netCDF4", "pooch", "pydap", "scipy", "zarr"] +io = ["cftime", "fsspec", "h5netcdf", "netCDF4", "pooch", "pydap ; python_version < \"3.10\"", "scipy", "zarr"] parallel = ["dask[complete]"] viz = ["cartopy", "matplotlib", "nc-time-axis", "seaborn"] @@ -4435,6 +4635,7 @@ version = "0.8.0" description = "Stats, linear algebra and einops for xarray" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "xarray_einstats-0.8.0-py3-none-any.whl", hash = "sha256:fd00552c3fb5c859b1ebc7c88a97342d3bb93d14bba904c5a9b94a4f724b76b4"}, {file = "xarray_einstats-0.8.0.tar.gz", hash = "sha256:7f1573f9bd4d60d6e7ed9fd27c4db39da51ec49bf8ba654d4602a139a6309d7f"}, @@ -4452,6 +4653,6 @@ numba = ["numba (>=0.55)"] test = ["hypothesis", "packaging", "pytest", "pytest-cov"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "d12c37e0236a664641851a3cda164db0494ef9abaf6f3e97bf5c0bb2fa79c99b" +content-hash = "79e2179157750db658a1f5a5b678a666d81cfa89bdbadae490ff2f1492d8e961" diff --git a/pygem/bin/run/run_calibration.py b/pygem/bin/run/run_calibration.py index 3884f4e4..9052af32 100755 --- a/pygem/bin/run/run_calibration.py +++ b/pygem/bin/run/run_calibration.py @@ -354,13 +354,10 @@ def calc_thick_change_1d(gdir, fls, mbmod, ds): years_subannual = np.array([d.year for d in gdir.dates_table['date']]) yrs = np.unique(years_subannual) # grab components of interest - bin_thick_annual = ds[0].thickness_m.values.T # glacier thickness [m ice], (nbins, nyears) - bin_massbalclim_ice_annual = ds[0].climatic_mb_myr.values.T[ + bin_massbalclim_ice_annual = ds[0].climatic_mb.values.T[ :, 1: ] # annual climatic mass balance [m ice] (nbins, nyears - 1) - bin_delta_thick_annual = ds[0].dhdt_myr.values.T[ - :, 1: - ] # annual change in ice thickness [m ice] (nbins, nyears - 1) + bin_delta_thick_annual = ds[0].dhdt.values.T[:, 1:] # annual change in ice thickness [m ice] (nbins, nyears - 1) bin_flux_divergence_annual = ( bin_massbalclim_ice_annual - bin_delta_thick_annual ) # annual flux divergence [m ice] (nbins, nyears - 1) @@ -384,8 +381,9 @@ def calc_thick_change_1d(gdir, fls, mbmod, ds): bin_delta_thick_subannual = bin_massbalclim_ice - bin_flux_divergence_subannual # --- Step 4: calculate subannual thickness = running thickness change + initial thickness--- + bin_thick_initial = ds[0].thickness_m.isel(time=0).values # initial glacier thickness [m ice], (nbins) running_bin_delta_thick_subannual = np.nancumsum(bin_delta_thick_subannual, axis=-1) - bin_thick_subannual = running_bin_delta_thick_subannual + bin_thick_annual[:, 0][:, np.newaxis] + bin_thick_subannual = running_bin_delta_thick_subannual + bin_thick_initial[:, np.newaxis] # --- Step 5: rebin --- # get surface height at the specified reference year diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index a3638e96..9dfc4d57 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -19,7 +19,8 @@ config_manager = ConfigManager() # read the config pygem_prms = config_manager.read_config() -from oggm import tasks, workflow +from oggm import cfg, tasks, workflow +from oggm.core.flowline import FluxBasedModel import pygem.pygem_modelsetup as modelsetup from pygem import class_climate @@ -34,10 +35,10 @@ from pygem.utils._funcs import interp1d_fill_gaps -def calculate_elev_change_1d(gdir): +def calc_thick_change_1d(gdir): """ - calculate the 1d elevation change from dynamical spinup. - assumes constant flux divergence througohut each model year. + calculate binned change in ice thickness assuming constant annual flux divergence. + sub-annual ice thickness is differenced at timesteps coincident with observations. """ # load flowline_diagnostics from spinup f = gdir.get_filepath('fl_diagnostics', filesuffix='_dynamic_spinup_pygem_mb') @@ -53,35 +54,34 @@ def calculate_elev_change_1d(gdir): 0, ) - ### get monthly elevation change ### - # note, transpose and [:, 1:] indexing to access desired OGGM dataset outputs - # OGGM stores data following (nsteps, nbins) - while PyGEM follows (nbins, nsteps), hence .T operator - # OGGM also stores the 0th model year with np.nan values, hence [:,1:] indexing. Time index 1 corresponds to the output from model year 0-1 - # --- Step 1: convert mass balance from m w.e. to m ice --- - rho_w = pygem_prms['constants']['density_water'] - rho_i = pygem_prms['constants']['density_ice'] - bin_massbalclim_ice = ds_spn.climatic_mb_myr.values.T[:, 1:] * ( - rho_w / rho_i - ) # binned climatic mass balance (nbins, nsteps) - - # --- Step 2: expand annual climatic mass balance and flux divergence to monthly steps --- + yrs = np.unique(ds_spn.time.values)[:-1] + # grab components of interest + bin_massbalclim_ice_annual = ds_spn.climatic_mb.values.T[ + :, 1: + ] # annual climatic mass balance [m ice] (nbins, nyears - 1) + bin_delta_thick_annual = ds_spn.dhdt.values.T[:, 1:] # annual change in ice thickness [m ice] (nbins, nyears - 1) + bin_flux_divergence_annual = ( + bin_massbalclim_ice_annual - bin_delta_thick_annual + ) # annual flux divergence [m ice] (nbins, nyears - 1) + + # --- Step 1: expand annual climatic mass balance and flux divergence to monthly steps --- # assume the climatic mass balance and flux divergence are constant througohut the year # ie. take annual values and divide spread uniformly throughout model year - bin_massbalclim_ice_monthly = np.repeat(bin_massbalclim_ice / 12, 12, axis=-1) # [m ice] + bin_massbalclim_ice_monthly = np.repeat(bin_massbalclim_ice_annual / 12, 12, axis=-1) # [m ice] bin_flux_divergence_monthly = np.repeat( - -ds_spn.flux_divergence_myr.values.T[:, 1:] / 12, 12, axis=-1 + bin_flux_divergence_annual / 12, 12, axis=-1 ) # [m ice] note, oggm flux_divergence_myr is opposite sign of convention, hence negative - # --- Step 3: compute monthly thickness change --- + # --- Step 2: compute monthly thickness change --- bin_delta_thick_monthly = bin_massbalclim_ice_monthly - bin_flux_divergence_monthly # [m ice] - # --- Step 4: calculate monthly thickness --- + # --- Step 3: calculate monthly thickness --- # calculate binned monthly thickness = running thickness change + initial thickness bin_thick_initial = ds_spn.thickness_m.isel(time=0).values # initial glacier thickness [m ice], (nbins) running_bin_delta_thick_monthly = np.cumsum(bin_delta_thick_monthly, axis=-1) bin_thick_monthly = running_bin_delta_thick_monthly + bin_thick_initial[:, np.newaxis] - # --- Step 5: rebin monthly thickness --- + # --- Step 4: rebin monthly thickness --- # get surface height at the specified reference year ref_surface_height = ds_spn.bed_h.values + ds_spn.thickness_m.sel(time=gdir.elev_change_1d['ref_dem_year']).values # aggregate model bin thicknesses @@ -101,8 +101,8 @@ def calculate_elev_change_1d(gdir): # interpolate over any empty bins bin_thick_monthly = np.column_stack([interp1d_fill_gaps(x.copy()) for x in bin_thick_monthly.T]) - # --- Step 6: calculate elevation change --- - elev_change_1d = np.column_stack( + # --- Step 5: calculate thickness change --- + bin_thick_change = np.column_stack( [ bin_thick_monthly[:, tup[1]] - bin_thick_monthly[:, tup[0]] if tup[0] is not None and tup[1] is not None @@ -111,7 +111,7 @@ def calculate_elev_change_1d(gdir): ] ) - return elev_change_1d, ds_spn.dis_along_flowline.values, area + return bin_thick_change, ds_spn.dis_along_flowline.values, area def loss_with_penalty(x, obs, mod, threshold=100, weight=1.0): @@ -191,9 +191,38 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N if glacier_rgi_table['TermType'] not in [1, 5] or not pygem_prms['setup']['include_frontalablation']: gd = single_flowline_glacier_directory(glacier_str, reset=False) gd.is_tidewater = False + kwargs['evolution_model'] = None # use default (SemiImplicitModel) else: gd = single_flowline_glacier_directory_with_calving(glacier_str, reset=False) gd.is_tidewater = True + kwargs['evolution_model'] = FluxBasedModel # use FluxBasedModel to allow for calving + kwargs['allow_calving'] = True + cfg.PARAMS['use_kcalving_for_inversion'] = True + cfg.PARAMS['use_kcalving_for_run'] = True + # Load quality controlled frontal ablation data + fp = f'{pygem_prms["root"]}/{pygem_prms["calib"]["data"]["frontalablation"]["frontalablation_relpath"]}/analysis/{pygem_prms["calib"]["data"]["frontalablation"]["frontalablation_cal_fn"]}' + assert os.path.exists(fp), 'Calibrated calving dataset does not exist' + calving_df = pd.read_csv(fp) + calving_rgiids = list(calving_df.RGIId) + + # Use calibrated value if individual data available + if gd.rgi_id in calving_rgiids: + calving_idx = calving_rgiids.index(gd.rgi_id) + calving_k = calving_df.loc[calving_idx, 'calving_k'] + # Otherwise, use region's median value + else: + calving_df['O1Region'] = [int(x.split('-')[1].split('.')[0]) for x in calving_df.RGIId.values] + calving_df_reg = calving_df.loc[calving_df['O1Region'] == int(gd.rgi_id[6:8]), :] + calving_k = np.median(calving_df_reg.calving_k) + + # set calving_k + cfg.PARAMS['calving_k'] = calving_k + cfg.PARAMS['inversion_calving_k'] = calving_k + if debug: + print(f'calving_k = {calving_k}') + # ensure inversion params are used for run + cfg.PARAMS['use_inversion_params_for_run'] = True + kwargs['is_tidewater'] = gd.is_tidewater # Select subsets of data gd.glacier_rgi_table = glacier_rgi_table @@ -303,7 +332,7 @@ def _objective(**kwargs): for start, end in gd.elev_change_1d['dates'] ] - dh_hat, dist, bin_area = calculate_elev_change_1d(gd) + dh_hat, dist, bin_area = calc_thick_change_1d(gd) dhdt_hat = dh_hat / gd.elev_change_1d['nyrs'] # plot binned surface area diff --git a/pyproject.toml b/pyproject.toml index 5fce5249..5c153d38 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ scikit-learn = "^1.5.2" tqdm = "^4.66.6" jupyter = "^1.1.1" arviz = "^0.20.0" -oggm = "^1.6.2" +oggm = { git = "https://github.com/OGGM/oggm.git"} ruamel-yaml = "^0.18.10" ruff = ">=0.9.6" pytest = ">=8.3.4" From a8f6c9fd8c412d6003ef9b7db699676974a08ada Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Mon, 1 Dec 2025 09:18:56 -0500 Subject: [PATCH 02/14] Pull cfl params from pygem config --- pygem/bin/run/run_inversion.py | 14 +++--- pygem/bin/run/run_spinup.py | 78 ++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/pygem/bin/run/run_inversion.py b/pygem/bin/run/run_inversion.py index edc01a67..a018b4d5 100644 --- a/pygem/bin/run/run_inversion.py +++ b/pygem/bin/run/run_inversion.py @@ -401,14 +401,12 @@ def main(): nargs='+', help='Randoph Glacier Inventory glacier number (can take multiple)', ) - ( - parser.add_argument( - '-rgi_glac_number_fn', - type=str, - default=None, - help='Filepath containing list of rgi_glac_number, helpful for running batches on spc', - ), - ) + parser.add_argument( + '-rgi_glac_number_fn', + type=str, + default=None, + help='Filepath containing list of rgi_glac_number, helpful for running batches on spc', + ), parser.add_argument( '-calibrate_regional_glen_a', type=str2bool, diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index 9dfc4d57..de346dd6 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -32,7 +32,7 @@ single_flowline_glacier_directory_with_calving, update_cfg, ) -from pygem.utils._funcs import interp1d_fill_gaps +from pygem.utils._funcs import interp1d_fill_gaps, str2bool def calc_thick_change_1d(gdir): @@ -191,37 +191,38 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N if glacier_rgi_table['TermType'] not in [1, 5] or not pygem_prms['setup']['include_frontalablation']: gd = single_flowline_glacier_directory(glacier_str, reset=False) gd.is_tidewater = False - kwargs['evolution_model'] = None # use default (SemiImplicitModel) else: gd = single_flowline_glacier_directory_with_calving(glacier_str, reset=False) gd.is_tidewater = True - kwargs['evolution_model'] = FluxBasedModel # use FluxBasedModel to allow for calving - kwargs['allow_calving'] = True - cfg.PARAMS['use_kcalving_for_inversion'] = True - cfg.PARAMS['use_kcalving_for_run'] = True - # Load quality controlled frontal ablation data - fp = f'{pygem_prms["root"]}/{pygem_prms["calib"]["data"]["frontalablation"]["frontalablation_relpath"]}/analysis/{pygem_prms["calib"]["data"]["frontalablation"]["frontalablation_cal_fn"]}' - assert os.path.exists(fp), 'Calibrated calving dataset does not exist' - calving_df = pd.read_csv(fp) - calving_rgiids = list(calving_df.RGIId) - - # Use calibrated value if individual data available - if gd.rgi_id in calving_rgiids: - calving_idx = calving_rgiids.index(gd.rgi_id) - calving_k = calving_df.loc[calving_idx, 'calving_k'] - # Otherwise, use region's median value - else: - calving_df['O1Region'] = [int(x.split('-')[1].split('.')[0]) for x in calving_df.RGIId.values] - calving_df_reg = calving_df.loc[calving_df['O1Region'] == int(gd.rgi_id[6:8]), :] - calving_k = np.median(calving_df_reg.calving_k) - - # set calving_k - cfg.PARAMS['calving_k'] = calving_k - cfg.PARAMS['inversion_calving_k'] = calving_k - if debug: - print(f'calving_k = {calving_k}') + if kwargs['allow_calving']: + kwargs['evolution_model'] = FluxBasedModel # use FluxBasedModel to allow for calving + cfg.PARAMS['use_kcalving_for_inversion'] = True + cfg.PARAMS['use_kcalving_for_run'] = True + # Load quality controlled frontal ablation data + fp = f'{pygem_prms["root"]}/{pygem_prms["calib"]["data"]["frontalablation"]["frontalablation_relpath"]}/analysis/{pygem_prms["calib"]["data"]["frontalablation"]["frontalablation_cal_fn"]}' + assert os.path.exists(fp), 'Calibrated calving dataset does not exist' + calving_df = pd.read_csv(fp) + calving_rgiids = list(calving_df.RGIId) + + # Use calibrated value if individual data available + if gd.rgi_id in calving_rgiids: + calving_idx = calving_rgiids.index(gd.rgi_id) + calving_k = calving_df.loc[calving_idx, 'calving_k'] + # Otherwise, use region's median value + else: + calving_df['O1Region'] = [int(x.split('-')[1].split('.')[0]) for x in calving_df.RGIId.values] + calving_df_reg = calving_df.loc[calving_df['O1Region'] == int(gd.rgi_id[6:8]), :] + calving_k = np.median(calving_df_reg.calving_k) + + # set calving_k + cfg.PARAMS['calving_k'] = calving_k + cfg.PARAMS['inversion_calving_k'] = calving_k + if debug: + print(f'calving_k = {calving_k}') # ensure inversion params are used for run cfg.PARAMS['use_inversion_params_for_run'] = True + cfg.PARAMS['cfl_number'] = pygem_prms['sim']['oggm_dynamics']['cfl_number'] + cfg.PARAMS['cfl_min_dt'] = pygem_prms['sim']['oggm_dynamics']['cfl_min_dt'] kwargs['is_tidewater'] = gd.is_tidewater # Select subsets of data @@ -495,15 +496,13 @@ def main(): nargs='+', help='Randoph Glacier Inventory glacier number (can take multiple)', ) - ( - parser.add_argument( - '-rgi_glac_number_fn', - action='store', - type=str, - default=None, - help='Filepath containing list of rgi_glac_number, helpful for running batches on spc', - ), - ) + parser.add_argument( + '-rgi_glac_number_fn', + action='store', + type=str, + default=None, + help='Filepath containing list of rgi_glac_number, helpful for running batches on spc', + ), parser.add_argument('-target_yr', type=int, default=None) parser.add_argument('-ye', type=int, default=None) parser.add_argument( @@ -549,6 +548,12 @@ def main(): parser.add_argument( '-outdir', type=str, default=None, help='Directory to store any ouputs (diagnostic figures, etc.)' ) + parser.add_argument( + '-allow_calving', + type=str2bool, + default=pygem_prms['setup']['include_frontalablation'], + help="If True (False) include (don't include) calving for tidewater glaciers.", + ) parser.add_argument('-v', '--debug', action='store_true', help='Flag for debugging') args = parser.parse_args() @@ -601,6 +606,7 @@ def main(): target_yr=args.target_yr, spinup_period=args.spinup_period, ye=args.ye, + allow_calving=args.allow_calving, ) # parallel processing From 11d133edcb2ca86066f771c423a73e19a6972263 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Mon, 1 Dec 2025 12:00:04 -0500 Subject: [PATCH 03/14] handle failed spinup --- pygem/bin/run/run_inversion.py | 2 +- pygem/bin/run/run_spinup.py | 175 ++++++++++++++++++--------------- 2 files changed, 94 insertions(+), 83 deletions(-) diff --git a/pygem/bin/run/run_inversion.py b/pygem/bin/run/run_inversion.py index a018b4d5..33cca51d 100644 --- a/pygem/bin/run/run_inversion.py +++ b/pygem/bin/run/run_inversion.py @@ -406,7 +406,7 @@ def main(): type=str, default=None, help='Filepath containing list of rgi_glac_number, helpful for running batches on spc', - ), + ) parser.add_argument( '-calibrate_regional_glen_a', type=str2bool, diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index de346dd6..adc9e815 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -195,7 +195,9 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N gd = single_flowline_glacier_directory_with_calving(glacier_str, reset=False) gd.is_tidewater = True if kwargs['allow_calving']: - kwargs['evolution_model'] = FluxBasedModel # use FluxBasedModel to allow for calving + kwargs['evolution_model'] = partial( + FluxBasedModel, water_level=gd.get_diagnostics().get('calving_water_level', None) + ) # use FluxBasedModel to allow for calving cfg.PARAMS['use_kcalving_for_inversion'] = True cfg.PARAMS['use_kcalving_for_run'] = True # Load quality controlled frontal ablation data @@ -369,96 +371,105 @@ def _objective(**kwargs): print('All results:', {k: v[0] for k, v in results.items()}) print(f'Best spinup_period = {best_period}, mismatch = {best_value}') + if all(v[1] is None for v in results.values()): + raise ValueError('Spinup failed for all tested periods') + # find worst - ignore failed runs - worst_period = max((k for k in results if results[k][0] != float('inf')), key=lambda k: results[k][0]) + worst_period = max( + (k for k in results if results[k][0] != float('inf')), + key=lambda k: results[k][0], + default=best_period, + ) worst_value, worst_model = results[worst_period] ############################ ### diagnostics plotting ### ############################ - # binned area - ax.legend() - ax.set_title(gd.rgi_id) - ax.set_xlabel('distance along flowline (m)') - ax.set_ylabel('surface area (m$^2$)') - ax.set_xlim([0, ax.get_xlim()[1]]) - ax.set_ylim([0, ax.get_ylim()[1]]) - fig.tight_layout() - if debug and ncores == 1: - plt.show() - if outdir: - fig.savefig(f'{outdir}/{glac_no}-spinup_binned_area.png', dpi=300) + if best_model is not None and worst_model is not None: + # binned area + ax.legend() + ax.set_title(gd.rgi_id) + ax.set_xlabel('distance along flowline (m)') + ax.set_ylabel('surface area (m$^2$)') + ax.set_xlim([0, ax.get_xlim()[1]]) + ax.set_ylim([0, ax.get_ylim()[1]]) + fig.tight_layout() + if debug and ncores == 1: + plt.show() + if outdir: + fig.savefig(f'{outdir}/{glac_no}-spinup_binned_area.png', dpi=300) plt.close() - # 1d elevation change - labels = [ - (f'{start[:-2].replace("-", "")}:{end[:-3].replace("-", "")}') - for start, end in gd.elev_change_1d['dates'] - ] - fig, ax = plt.subplots(figsize=(8, 5)) - - for t in range(gd.elev_change_1d['dhdt'].shape[1]): - # plot Obs first, grab the color - (line,) = ax.plot( - gd.elev_change_1d['bin_centers'], - gd.elev_change_1d['dhdt'][:, t], - linestyle='-', - marker='.', - label=labels[t], - ) - color = line.get_color() - - # plot Best model with same color - ax.plot( - gd.elev_change_1d['bin_centers'], - best_model[:, t], - linestyle='--', - marker='.', - color=color, - ) + if best_model is not None and worst_model is not None: + # 1d elevation change + labels = [ + (f'{start[:-2].replace("-", "")}:{end[:-3].replace("-", "")}') + for start, end in gd.elev_change_1d['dates'] + ] + fig, ax = plt.subplots(figsize=(8, 5)) + + for t in range(gd.elev_change_1d['dhdt'].shape[1]): + # plot Obs first, grab the color + (line,) = ax.plot( + gd.elev_change_1d['bin_centers'], + gd.elev_change_1d['dhdt'][:, t], + linestyle='-', + marker='.', + label=labels[t], + ) + color = line.get_color() + + # plot Best model with same color + ax.plot( + gd.elev_change_1d['bin_centers'], + best_model[:, t], + linestyle='--', + marker='.', + color=color, + ) - # plot Worst model with same color - ax.plot( - gd.elev_change_1d['bin_centers'], - worst_model[:, t], - linestyle=':', - marker='.', - color=color, - ) - ax.axvline(gd.ela, c='grey', ls=':') - ax.axhline(0, c='grey', ls='-') - ax.plot([], [], 'k--', label=r'$\hat{best}$') - ax.plot([], [], 'k:', label=r'$\hat{worst}$') - ax.set_xlabel('elevation (m)') - ax.set_ylabel(r'elevation change (m yr$^{-1}$)') - ax.set_title( - f'{glac_no}\nBest={best_period} (mismatch={best_value:.3f}), ' - f'Worst={worst_period} (mismatch={worst_value:.3f})' - ) - ax.legend(handlelength=1, borderaxespad=0, fancybox=False) - # plot area - if 'bin_area' in gd.elev_change_1d: - area = np.array(gd.elev_change_1d['bin_area']) - area_mask = area > 0 - ax2 = ax.twinx() # shares x-axis - ax2.fill_between( - np.array(gd.elev_change_1d['bin_centers'])[area_mask], - 0, - area[area_mask], - color='gray', - alpha=0.1, + # plot Worst model with same color + ax.plot( + gd.elev_change_1d['bin_centers'], + worst_model[:, t], + linestyle=':', + marker='.', + color=color, + ) + ax.axvline(gd.ela, c='grey', ls=':') + ax.axhline(0, c='grey', ls='-') + ax.plot([], [], 'k--', label=r'$\hat{best}$') + ax.plot([], [], 'k:', label=r'$\hat{worst}$') + ax.set_xlabel('elevation (m)') + ax.set_ylabel(r'elevation change (m yr$^{-1}$)') + ax.set_title( + f'{glac_no}\nBest={best_period} (mismatch={best_value:.3f}), ' + f'Worst={worst_period} (mismatch={worst_value:.3f})' ) - ax2.set_ylim([0, ax2.get_ylim()[1]]) - ax2.set_ylabel(r'area (m $^{2}$)', color='gray') - ax2.tick_params(axis='y', colors='gray') - ax2.spines['right'].set_color('gray') - ax2.yaxis.label.set_color('gray') - fig.tight_layout() - if debug and ncores == 1: - plt.show() - if outdir: - fig.savefig(f'{outdir}/{glac_no}-spinup_optimization.png', dpi=300) - plt.close() + ax.legend(handlelength=1, borderaxespad=0, fancybox=False) + # plot area + if 'bin_area' in gd.elev_change_1d: + area = np.array(gd.elev_change_1d['bin_area']) + area_mask = area > 0 + ax2 = ax.twinx() # shares x-axis + ax2.fill_between( + np.array(gd.elev_change_1d['bin_centers'])[area_mask], + 0, + area[area_mask], + color='gray', + alpha=0.1, + ) + ax2.set_ylim([0, ax2.get_ylim()[1]]) + ax2.set_ylabel(r'area (m $^{2}$)', color='gray') + ax2.tick_params(axis='y', colors='gray') + ax2.spines['right'].set_color('gray') + ax2.yaxis.label.set_color('gray') + fig.tight_layout() + if debug and ncores == 1: + plt.show() + if outdir: + fig.savefig(f'{outdir}/{glac_no}-spinup_optimization.png', dpi=300) + plt.close() ############################ # update spinup_period if optimized or specified as CLI argument, else remove kwarg and use OGGM default @@ -502,7 +513,7 @@ def main(): type=str, default=None, help='Filepath containing list of rgi_glac_number, helpful for running batches on spc', - ), + ) parser.add_argument('-target_yr', type=int, default=None) parser.add_argument('-ye', type=int, default=None) parser.add_argument( From b978b7383aa47ff7bca465be0b765d7116932b36 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Fri, 5 Dec 2025 23:18:32 -0500 Subject: [PATCH 04/14] Allow for inversion in mcmc elev_change_1d calib --- pygem/bin/run/run_calibration.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pygem/bin/run/run_calibration.py b/pygem/bin/run/run_calibration.py index 9052af32..eedcd503 100755 --- a/pygem/bin/run/run_calibration.py +++ b/pygem/bin/run/run_calibration.py @@ -51,7 +51,7 @@ from pygem.shop import debris from pygem.utils._funcs import interp1d_fill_gaps from pygem.utils.stats import mcmc_stats - +from pygem.shop import debris # %% FUNCTIONS def getparser(): @@ -296,11 +296,13 @@ def run_inversion(gdir, modelprms, glacier_rgi_table, inversion_filter=pygem_prm tasks.init_present_time_glacier(gdir) # adds bins below if pygem_prms['mb']['include_debris']: - debris.debris_binned(gdir, fl_str='model_flowlines') # add debris enhancement factors to flowlines - + debris.debris_binned( + gdir, fl_str='model_flowlines' + ) # add debris enhancement factors to flowlines + return gdir.read_pickle('model_flowlines') - + def run_oggm_dynamics(gdir, modelprms, glacier_rgi_table, fls, debug=False): """run the dynamical evolution model with a given set of model parameters""" @@ -2110,15 +2112,14 @@ def rho_constraints(**kwargs): mbfxn = None # define args to pass to fxn2eval in mcmc sampler - fxn2eval = partial( - mcmc_model_eval, - gdir=gdir, - glacier_rgi_table=glacier_rgi_table, - fls=fls, - mbfxn=mbfxn, - calib_elev_change_1d=args.option_calib_elev_change_1d, - do_inversion=args.option_calib_elev_change_1d and not args.spinup, - ) + fxn2eval = partial(mcmc_model_eval, + gdir=gdir, + glacier_rgi_table=glacier_rgi_table, + fls=fls, + mbfxn=mbfxn, + calib_elev_change_1d=args.option_calib_elev_change_1d, + do_inversion=args.option_calib_elev_change_1d and not args.spinup + ) # instantiate mbPosterior given priors, and observed values # note, mbEmulator.eval expects the modelprms to be ordered like so: [tbias, kp, ddfsnow], so priors and initial guesses must also be ordered as such) From c2027ea078ad7b035ff89a09ef27897865cfeadc Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Fri, 5 Dec 2025 23:29:03 -0500 Subject: [PATCH 05/14] Ruffed --- pygem/bin/run/run_calibration.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/pygem/bin/run/run_calibration.py b/pygem/bin/run/run_calibration.py index eedcd503..9052af32 100755 --- a/pygem/bin/run/run_calibration.py +++ b/pygem/bin/run/run_calibration.py @@ -51,7 +51,7 @@ from pygem.shop import debris from pygem.utils._funcs import interp1d_fill_gaps from pygem.utils.stats import mcmc_stats -from pygem.shop import debris + # %% FUNCTIONS def getparser(): @@ -296,13 +296,11 @@ def run_inversion(gdir, modelprms, glacier_rgi_table, inversion_filter=pygem_prm tasks.init_present_time_glacier(gdir) # adds bins below if pygem_prms['mb']['include_debris']: - debris.debris_binned( - gdir, fl_str='model_flowlines' - ) # add debris enhancement factors to flowlines - + debris.debris_binned(gdir, fl_str='model_flowlines') # add debris enhancement factors to flowlines + return gdir.read_pickle('model_flowlines') - + def run_oggm_dynamics(gdir, modelprms, glacier_rgi_table, fls, debug=False): """run the dynamical evolution model with a given set of model parameters""" @@ -2112,14 +2110,15 @@ def rho_constraints(**kwargs): mbfxn = None # define args to pass to fxn2eval in mcmc sampler - fxn2eval = partial(mcmc_model_eval, - gdir=gdir, - glacier_rgi_table=glacier_rgi_table, - fls=fls, - mbfxn=mbfxn, - calib_elev_change_1d=args.option_calib_elev_change_1d, - do_inversion=args.option_calib_elev_change_1d and not args.spinup - ) + fxn2eval = partial( + mcmc_model_eval, + gdir=gdir, + glacier_rgi_table=glacier_rgi_table, + fls=fls, + mbfxn=mbfxn, + calib_elev_change_1d=args.option_calib_elev_change_1d, + do_inversion=args.option_calib_elev_change_1d and not args.spinup, + ) # instantiate mbPosterior given priors, and observed values # note, mbEmulator.eval expects the modelprms to be ordered like so: [tbias, kp, ddfsnow], so priors and initial guesses must also be ordered as such) From ddd8b79a0822183f65debf33731d3b0c0eaa13d3 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Wed, 10 Dec 2025 10:56:09 -0500 Subject: [PATCH 06/14] Optimize spinup run 0-year period with inversion dynamical run --- pygem/bin/run/run_spinup.py | 98 +++++++++++++++++++++++++++++++++---- 1 file changed, 89 insertions(+), 9 deletions(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index adc9e815..86597d4e 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -20,18 +20,17 @@ # read the config pygem_prms = config_manager.read_config() from oggm import cfg, tasks, workflow -from oggm.core.flowline import FluxBasedModel +from oggm.core import flowline import pygem.pygem_modelsetup as modelsetup from pygem import class_climate from pygem.massbalance import PyGEMMassBalance_wrapper - -# from pygem.glacierdynamics import MassRedistributionCurveModel from pygem.oggm_compat import ( single_flowline_glacier_directory, single_flowline_glacier_directory_with_calving, update_cfg, ) +from pygem.shop import debris from pygem.utils._funcs import interp1d_fill_gaps, str2bool @@ -149,6 +148,79 @@ def run_spinup(gd, **kwargs): return out +# run inversion at year 2000 +def run_inversion(gd, **kwargs): + if gd.is_tidewater: + cfg.PARAMS['use_kcalving_for_inversion'] = True + tasks.find_inversion_calving_from_any_mb( + gd, + mb_model=PyGEMMassBalance_wrapper( + gd, + fl_str='inversion_flowlines', + option_areaconstant=True, + ), + glen_a=gd.get_diagnostics().get('inversion_glen_a', None), + fs=gd.get_diagnostics().get('inversion_fs', None), + ) + else: + cfg.PARAMS['use_kcalving_for_inversion'] = False + tasks.prepare_for_inversion(gd) + tasks.mass_conservation_inversion( + gd, + glen_a=gd.get_diagnostics().get('inversion_glen_a', None), + fs=gd.get_diagnostics().get('inversion_fs', None), + ) + # create the dynamic flowlines + workflow.execute_entity_task(tasks.init_present_time_glacier, [gd]) + + # add debris to model_flowlines + workflow.execute_entity_task(debris.debris_binned, [gd], fl_str='model_flowlines') + + return _run_oggm_dynamics(gd, **kwargs) + + +def _run_oggm_dynamics(gd, **kwargs): + """run the dynamical evolution model with a given set of model parameters""" + y0 = 2000 + y1 = gd.dates_table.year.max() + fls = gd.read_pickle('model_flowlines') + # mass balance model with evolving area + mbmod = PyGEMMassBalance_wrapper( + gd, + fl_str='model_flowlines', + ) + + # glacier dynamics model + if gd.is_tidewater and pygem_prms['setup']['include_frontalablation']: + ev_model = flowline.FluxBasedModel( + fls, + y0=y0, + mb_model=mbmod, + glen_a=gd.get_diagnostics()['inversion_glen_a'], + fs=gd.get_diagnostics()['inversion_fs'], + is_tidewater=gd.is_tidewater, + water_level=gd.get_diagnostics().get('calving_water_level', None), + do_kcalving=pygem_prms['setup']['include_frontalablation'], + ) + else: + ev_model = flowline.SemiImplicitModel( + fls, + y0=y0, + mb_model=mbmod, + glen_a=gd.get_diagnostics()['inversion_glen_a'], + fs=gd.get_diagnostics()['inversion_fs'], + ) + try: + # run glacier dynamics model forward + ev_model.run_until_and_store( + y1 + 1, fl_diag_path=gd.get_filepath('fl_diagnostics', filesuffix='_dynamic_spinup_pygem_mb') + ) + return [ev_model] + # safely catch any errors with dynamical run + except Exception: + return [None] + + def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=None, debug=False, ncores=1, **kwargs): # remove any None kwargs kwargs = {k: v for k, v in kwargs.items() if v is not None} @@ -196,7 +268,7 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N gd.is_tidewater = True if kwargs['allow_calving']: kwargs['evolution_model'] = partial( - FluxBasedModel, water_level=gd.get_diagnostics().get('calving_water_level', None) + flowline.FluxBasedModel, water_level=gd.get_diagnostics().get('calving_water_level', None) ) # use FluxBasedModel to allow for calving cfg.PARAMS['use_kcalving_for_inversion'] = True cfg.PARAMS['use_kcalving_for_run'] = True @@ -296,7 +368,7 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N ############################ # update cfg.PARAMS - update_cfg({'continue_on_error': True}, 'PARAMS') + update_cfg({'continue_on_error': False}, 'PARAMS') update_cfg({'store_model_geometry': True}, 'PARAMS') # optimize against binned dhdt data @@ -317,12 +389,18 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N # objective function to evaluate def _objective(**kwargs): - fls = run_spinup(gd, **kwargs) + if gd.rgi_date + 1 - kwargs['spinup_period'] >= 2000: + fls = run_inversion(gd, **kwargs) + else: + fls = run_spinup(gd, **kwargs) + if fls[0] is None: return kwargs['spinup_period'], float('inf'), None # get true spinup period (note, if initial fails, oggm tries period/2) spinup_period_ = gd.rgi_date + 1 - fls[0].y0 + if spinup_period_ in results.keys(): + return None # create lookup dict (timestamp → index) dtable = modelsetup.datesmodelrun(startyear=fls[0].y0, endyear=kwargs['ye']) @@ -339,7 +417,7 @@ def _objective(**kwargs): dhdt_hat = dh_hat / gd.elev_change_1d['nyrs'] # plot binned surface area - ax.plot(dist, bin_area, label=f'{spinup_period} years: {round(1e-6 * np.sum(bin_area), 1)} km$^2$') + ax.plot(dist, bin_area, label=f'{spinup_period_} years: {round(1e-6 * np.sum(bin_area), 1)} km$^2$') # penalize positive values below specified elevation threshold loss = loss_with_penalty( @@ -350,6 +428,8 @@ def _objective(**kwargs): # evaluate candidate spinup periods for p in periods2try: + if p in results.keys(): + continue kwargs['spinup_period'] = p p_, mismatch, model = _objective(**kwargs) results[p_] = (mismatch, model) @@ -550,10 +630,10 @@ def main(): '-periods2try', type=int, nargs='+', - default=[20, 30, 40, 50, 60], + default=[0, 10, 20, 30, 40, 50, 60], help=( 'Optional list of spinup periods (years) to test if -optimize is used. ' - 'Ignored otherwise. Example: -periods2try 20 30 40 50 60' + 'Ignored otherwise. Example: -periods2try 0 10 20 30 40 50 60' ), ) parser.add_argument( From e313d8986aa84395415a55719b939038c61f754c Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Wed, 10 Dec 2025 10:57:27 -0500 Subject: [PATCH 07/14] Continue on error=True --- pygem/bin/run/run_spinup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index 86597d4e..f6be340a 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -368,7 +368,7 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N ############################ # update cfg.PARAMS - update_cfg({'continue_on_error': False}, 'PARAMS') + update_cfg({'continue_on_error': True}, 'PARAMS') update_cfg({'store_model_geometry': True}, 'PARAMS') # optimize against binned dhdt data From a004f26c08ab48219a2987f129da7a3343038255 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Wed, 10 Dec 2025 12:24:24 -0500 Subject: [PATCH 08/14] Spinup bug fix --- pygem/bin/run/run_spinup.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index f6be340a..495b6152 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -399,8 +399,6 @@ def _objective(**kwargs): # get true spinup period (note, if initial fails, oggm tries period/2) spinup_period_ = gd.rgi_date + 1 - fls[0].y0 - if spinup_period_ in results.keys(): - return None # create lookup dict (timestamp → index) dtable = modelsetup.datesmodelrun(startyear=fls[0].y0, endyear=kwargs['ye']) @@ -431,8 +429,12 @@ def _objective(**kwargs): if p in results.keys(): continue kwargs['spinup_period'] = p - p_, mismatch, model = _objective(**kwargs) - results[p_] = (mismatch, model) + out = _objective(**kwargs) + if isinstance(out, tuple): + p_, mismatch, model = out + results[out[0]] = (out[1], out[2]) + else: + continue # find best best_period = min(results, key=lambda k: results[k][0]) @@ -441,8 +443,7 @@ def _objective(**kwargs): kwargs['spinup_period'] = best_period # ensure spinup start year <= min_start_yr if gd.rgi_date + 1 - best_period > min_start_yr: - kwargs['spinup_start_yr'] = min_start_yr - kwargs.pop('spinup_period') + kwargs['spinup_period'] = gd.rgi_date + 1 - min_start_yr p_, best_value, best_model = _objective(**kwargs) results[p_] = (mismatch, model) best_period = gd.rgi_date + 1 - min_start_yr From 1f844701de93a048960a410ae6b84a96e11b0f7d Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Thu, 11 Dec 2025 21:12:15 -0500 Subject: [PATCH 09/14] Run final inversion if best period ==0 --- pygem/bin/run/run_spinup.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index 495b6152..69f5c0ce 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -326,7 +326,7 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N gd.elev_change_1d = gd.read_json('elev_change_1d') else: gd.elev_change_1d = None - + print(gd.rgi_date + 1) ############################ ####### model params ####### ############################ @@ -389,10 +389,12 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N # objective function to evaluate def _objective(**kwargs): - if gd.rgi_date + 1 - kwargs['spinup_period'] >= 2000: + if kwargs['spinup_period'] == 0: fls = run_inversion(gd, **kwargs) - else: + elif gd.rgi_date + 1 - kwargs['spinup_period'] < 2000: fls = run_spinup(gd, **kwargs) + else: + return [None] if fls[0] is None: return kwargs['spinup_period'], float('inf'), None @@ -426,8 +428,12 @@ def _objective(**kwargs): # evaluate candidate spinup periods for p in periods2try: + # skip any periods that were already run if p in results.keys(): continue + # skip any periods that would start after min_start_yr (unless p=0, in which case inversion is run at 2000) + if (p != 0) and (gd.rgi_date + 1 - p > min_start_yr): + continue kwargs['spinup_period'] = p out = _objective(**kwargs) if isinstance(out, tuple): @@ -554,7 +560,10 @@ def _objective(**kwargs): ############################ # update spinup_period if optimized or specified as CLI argument, else remove kwarg and use OGGM default - run_spinup(gd, **kwargs) + if gd.rgi_date + 1 - kwargs['spinup_period'] == 2000: + fls = run_inversion(gd, **kwargs) + else: + fls = run_spinup(gd, **kwargs) except Exception as e: print(f'Error processing glacier {glac_no}: {e}') From 0a5cf8658bb6998b3d360b5a4bb401882ea2ec90 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Thu, 11 Dec 2025 21:22:41 -0500 Subject: [PATCH 10/14] Run final inversion if best period ==0 --- pygem/bin/run/run_spinup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index 69f5c0ce..ed992061 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -326,7 +326,6 @@ def run(glacno_list, mb_model_params, optimize=False, periods2try=[20], outdir=N gd.elev_change_1d = gd.read_json('elev_change_1d') else: gd.elev_change_1d = None - print(gd.rgi_date + 1) ############################ ####### model params ####### ############################ From 90013401af65a0b628ecaad5718e37a6c4c8a14f Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Thu, 11 Dec 2025 22:06:49 -0500 Subject: [PATCH 11/14] Run final inversion if best period ==0 --- pygem/bin/run/run_spinup.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index ed992061..25afaf7b 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -399,8 +399,8 @@ def _objective(**kwargs): return kwargs['spinup_period'], float('inf'), None # get true spinup period (note, if initial fails, oggm tries period/2) - spinup_period_ = gd.rgi_date + 1 - fls[0].y0 - + if kwargs['spinup_period'] != 0: + kwargs['spinup_period'] = gd.rgi_date + 1 - fls[0].y0 # create lookup dict (timestamp → index) dtable = modelsetup.datesmodelrun(startyear=fls[0].y0, endyear=kwargs['ye']) date_to_index = {d: i for i, d in enumerate(dtable['date'])} @@ -416,14 +416,18 @@ def _objective(**kwargs): dhdt_hat = dh_hat / gd.elev_change_1d['nyrs'] # plot binned surface area - ax.plot(dist, bin_area, label=f'{spinup_period_} years: {round(1e-6 * np.sum(bin_area), 1)} km$^2$') + ax.plot( + dist, + bin_area, + label=f'{kwargs["spinup_period"]} years: {round(1e-6 * np.sum(bin_area), 1)} km$^2$', + ) # penalize positive values below specified elevation threshold loss = loss_with_penalty( gd.elev_change_1d['bin_centers'], gd.elev_change_1d['dhdt'], dhdt_hat, gd.ela ) - return spinup_period_, loss, dhdt_hat + return kwargs['spinup_period'], loss, dhdt_hat # evaluate candidate spinup periods for p in periods2try: @@ -442,6 +446,7 @@ def _objective(**kwargs): continue # find best + results = {k: v for k, v in results.items() if not np.isnan(v[0])} best_period = min(results, key=lambda k: results[k][0]) best_value, best_model = results[best_period] # update kwarg @@ -559,7 +564,7 @@ def _objective(**kwargs): ############################ # update spinup_period if optimized or specified as CLI argument, else remove kwarg and use OGGM default - if gd.rgi_date + 1 - kwargs['spinup_period'] == 2000: + if kwargs['spinup_period'] == 0: fls = run_inversion(gd, **kwargs) else: fls = run_spinup(gd, **kwargs) From 86a3ca623d0afa9470b766689495ce877407db70 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Fri, 12 Dec 2025 10:25:14 -0500 Subject: [PATCH 12/14] Cleanup spinup optimization --- pygem/bin/run/run_spinup.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index 25afaf7b..390b759d 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -451,12 +451,6 @@ def _objective(**kwargs): best_value, best_model = results[best_period] # update kwarg kwargs['spinup_period'] = best_period - # ensure spinup start year <= min_start_yr - if gd.rgi_date + 1 - best_period > min_start_yr: - kwargs['spinup_period'] = gd.rgi_date + 1 - min_start_yr - p_, best_value, best_model = _objective(**kwargs) - results[p_] = (mismatch, model) - best_period = gd.rgi_date + 1 - min_start_yr if debug: print('All results:', {k: v[0] for k, v in results.items()}) From 5e006c4b63d8e004d0f95ecc26c3eecdc3bf0bd4 Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Fri, 12 Dec 2025 14:01:35 -0500 Subject: [PATCH 13/14] Error handling --- pygem/bin/run/run_spinup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index 390b759d..e40e6d99 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -556,9 +556,9 @@ def _objective(**kwargs): fig.savefig(f'{outdir}/{glac_no}-spinup_optimization.png', dpi=300) plt.close() ############################ - # update spinup_period if optimized or specified as CLI argument, else remove kwarg and use OGGM default - if kwargs['spinup_period'] == 0: + period = kwargs.get('spinup_period') + if period == 0: fls = run_inversion(gd, **kwargs) else: fls = run_spinup(gd, **kwargs) From 085d24d928e5424680fbc8dc8faa9e037930e8eb Mon Sep 17 00:00:00 2001 From: "brandon s. tober" Date: Fri, 12 Dec 2025 23:59:36 -0500 Subject: [PATCH 14/14] Store model geom --- pygem/bin/run/run_spinup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pygem/bin/run/run_spinup.py b/pygem/bin/run/run_spinup.py index e40e6d99..4d9ea25b 100644 --- a/pygem/bin/run/run_spinup.py +++ b/pygem/bin/run/run_spinup.py @@ -213,7 +213,9 @@ def _run_oggm_dynamics(gd, **kwargs): try: # run glacier dynamics model forward ev_model.run_until_and_store( - y1 + 1, fl_diag_path=gd.get_filepath('fl_diagnostics', filesuffix='_dynamic_spinup_pygem_mb') + y1 + 1, + fl_diag_path=gd.get_filepath('fl_diagnostics', filesuffix='_dynamic_spinup_pygem_mb'), + geom_path=gd.get_filepath('model_geometry', filesuffix='_dynamic_spinup_pygem_mb'), ) return [ev_model] # safely catch any errors with dynamical run