From cfbafbf691ac376c9b78240a216a67182e8cb3cf Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Sun, 19 Jul 2026 18:01:10 +0200 Subject: [PATCH 01/10] Update codebase to mojo nightly --- benches/bigdecimal/mojo/bench.mojo | 12 +- benches/bigint/mojo/bench.mojo | 10 +- pixi.lock | 2605 ++++++++++------------ pixi.toml | 6 +- src/decimo/bigdecimal/arithmetics.mojo | 2 + src/decimo/bigdecimal/bigdecimal.mojo | 1 + src/decimo/bigdecimal/constants.mojo | 1 + src/decimo/bigdecimal/exponential.mojo | 3 +- src/decimo/bigdecimal/rounding.mojo | 1 + src/decimo/bigdecimal/trigonometric.mojo | 1 + src/decimo/bigint/arithmetics.mojo | 108 +- src/decimo/bigint/bigint.mojo | 36 +- src/decimo/bigint/bitwise.mojo | 10 +- src/decimo/biguint/arithmetics.mojo | 60 +- src/decimo/biguint/biguint.mojo | 29 +- src/decimo/decimal128/decimal128.mojo | 5 +- src/decimo/decimal128/exponential.mojo | 1 + src/decimo/decimal128/special.mojo | 1 + src/decimo/str.mojo | 10 +- src/decimo/toml/parser.mojo | 19 +- 20 files changed, 1342 insertions(+), 1579 deletions(-) diff --git a/benches/bigdecimal/mojo/bench.mojo b/benches/bigdecimal/mojo/bench.mojo index 0665b8a6..27b3c1bd 100644 --- a/benches/bigdecimal/mojo/bench.mojo +++ b/benches/bigdecimal/mojo/bench.mojo @@ -82,7 +82,7 @@ def _parse_round_param(b: String) raises -> Tuple[Int, RoundingMode]: raise Error("unknown rounding mode: " + mode_str) -def _cmp_3way(read a: BigDecimal, read b: BigDecimal) raises -> String: +def _cmp_3way(imm a: BigDecimal, imm b: BigDecimal) raises -> String: """Stable, cross-language 3-way comparison: returns "-1", "0", or "1".""" if a < b: return String("-1") @@ -129,8 +129,8 @@ def _emit(v: BigDecimal) raises -> String: def _result_for( op: String, - read a: BigDecimal, - read b: BigDecimal, + imm a: BigDecimal, + imm b: BigDecimal, a_str: String, b_str: String, precision: Int, @@ -173,8 +173,8 @@ def _result_for( def _time_kernel( op: String, - read a: BigDecimal, - read b: BigDecimal, + imm a: BigDecimal, + imm b: BigDecimal, a_str: String, b_str: String, precision: Int, @@ -190,7 +190,7 @@ def _time_kernel( IS the operation under measurement, so those paths keep their natural shape (parse → BigDecimal, render → String). - Operands `a` / `b` are taken as `read` (borrowed) so no per-iter + Operands `a` / `b` are taken as `imm` (borrowed) so no per-iter deep copy of the heap-backed BigUInt occurs. """ if op == "add": diff --git a/benches/bigint/mojo/bench.mojo b/benches/bigint/mojo/bench.mojo index 1c9620c8..a46e1baa 100644 --- a/benches/bigint/mojo/bench.mojo +++ b/benches/bigint/mojo/bench.mojo @@ -56,8 +56,8 @@ def _csv_quote(s: String) -> String: def _result_for( op: String, - read a: BigInt, - read b: BigInt, + imm a: BigInt, + imm b: BigInt, a_str: String, b_int: Int, ) raises -> String: @@ -86,8 +86,8 @@ def _result_for( def _time_kernel( op: String, - read a: BigInt, - read b: BigInt, + imm a: BigInt, + imm b: BigInt, a_str: String, b_int: Int, ) raises: @@ -100,7 +100,7 @@ def _time_kernel( `sign`) to prevent dead-code elimination while keeping the keep cost negligible versus the op. - Operands `a` / `b` are taken as `read` (borrowed) so no per-iter + Operands `a` / `b` are taken as `imm` (borrowed) so no per-iter deep copy of the heap-backed word list occurs. """ if op == "add": diff --git a/pixi.lock b/pixi.lock index 41b5da27..4f440bd4 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,226 +1,189 @@ -version: 7 -platforms: -- name: linux-64 - virtual-packages: - - __unix=0=0 - - __linux=4.18 - - __glibc=2.28 - - __archspec=0=x86_64 -- name: osx-arm64 - virtual-packages: - - __unix=0=0 - - __osx=13.0 - - __archspec=0=m1 +version: 6 environments: default: channels: + - url: https://conda.modular.com/max-nightly/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - url: https://conda.anaconda.org/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py314h7fe84b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.5-py310hd8a072f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.12-h994f30f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026071805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-pyhcf101f3_0.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - - conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b2-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b2-release.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.4.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b2-release.conda - - conda: https://repo.prefix.dev/modular-community/linux-64/argmojo-0.7.0-hb0f4dca_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026071805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-pyhcf101f3_0.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py314hb84d1df_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.5-py310h3b8a9b8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.12-hbd3f8a3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py314h6c2aa35_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.4.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b2-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b2-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b2-release.conda - - conda: https://repo.prefix.dev/modular-community/osx-arm64/argmojo-0.7.0-h60d57d3_0.conda packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -235,6 +198,45 @@ packages: license_family: BSD size: 28948 timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + sha256: 2a7204314663eeda5dec482a956f0e2eaf289bd5b9953eaaaad0e81aa64638f2 + md5: 3845f3d75991bae0fb90884662f4327c + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + size: 8144 + timestamp: 1784221492234 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 + md5: 767d508c1a67e02ae8f50e44cacfadb2 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 7069 + timestamp: 1733218168786 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda + sha256: 25abdb37e186f0d6ac3b774a63c81c5bc4bf554b5096b51343fa5e7c381193b1 + md5: bea46844deb274b2cc2a3a941745fa73 + depends: + - python >=3.10 + - backports + - python + license: MIT + license_family: MIT + size: 35739 + timestamp: 1767290467820 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + noarch: generic + sha256: 709cac7434d1c5a8828105036212a2a36022a07d807e89e2e99cac939c2d2526 + md5: 40d89d8546ad6e139e73ec8f6d56068b + depends: + - python >=3.14 + license: BSD-3-Clause AND MIT AND EPL-2.0 + size: 7526 + timestamp: 1781450817767 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 md5: 8910d2c46f7e7b519129f486e0fe927a @@ -250,6 +252,21 @@ packages: license_family: MIT size: 367376 timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 + md5: f9501812fe7c66b6548c7fcaa1c1f252 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + size: 359854 + timestamp: 1764018178608 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -260,9 +277,34 @@ packages: license_family: BSD size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e - md5: cf45f4278afd6f4e6d03eda0f435d527 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf + md5: a9965dd99f683c5f444428f896635716 + depends: + - __unix + license: ISC + size: 128866 + timestamp: 1781708962055 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f + md5: c13824fedced67005d3832c152fe9c2f + depends: + - python >=3.10 + license: ISC + size: 133877 + timestamp: 1781719949728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + sha256: 39d0d45c4c73162c0aadd0b1bce6ce42ca354da65979f49d6084ff00ed5c26b4 + md5: 26f3b9c52441a170b2008cbc227f740a depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 @@ -272,37 +314,86 @@ packages: - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 300271 - timestamp: 1761203085220 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda - sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae - md5: 23985f6de5f68e3465807e1fbbc98f30 + size: 306297 + timestamp: 1783424159025 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + sha256: 8d8813ef655b4e75e4fb897abd83ad548882efad7b4e836b021b797f42780799 + md5: d154b40b109e503430979e8a8d099eaf depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.0.0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.10 license: MIT license_family: MIT - size: 144534 - timestamp: 1760363043706 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py314h7fe84b3_0.conda - sha256: 6ce32ae5829d21d3bca259f7e022d8a467d778ae1db548570a097d497c88012e - md5: 95d37edaeb19cc94ef1567a7e2abc1c9 + size: 61418 + timestamp: 1783505332569 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + sha256: ccc4787f511964f9a1f2d2d2859c91c5d571fb60f7f09d4c4e092c9b7a94e671 + md5: 2c4bd6aeb90bb157456841c3270a0d92 + depends: + - __unix + - python + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + size: 107155 + timestamp: 1783085363526 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda + sha256: f80e00a568128566ac97787afcc2701bd3e636799363b9e2c88ce8733361e525 + md5: a072db87d32836deeeffd30995529d63 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: BSD-2-Clause + license_family: BSD + size: 1280692 + timestamp: 1783844531090 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda + sha256: 07a9e5db549ea212bcd8543595340918e455affb4b4b126e6d3c6ff1fc15d2ae + md5: 7be112e4bbfe38ae52a82d64fb5193b1 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 1208953 + timestamp: 1783844567994 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + noarch: generic + sha256: 7a548856ef5307890a8cadfc196655117658f8c24589ce175caa4c1c2ded9d13 + md5: b28fe35fd43d5f425c0dccbe5b5039fd + depends: + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 + license: Python-2.0 + size: 49333 + timestamp: 1781254618863 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + sha256: 1c8128f2ba8fccf627729968de7fe7504dbb775c829e533439c9ee52134800fd + md5: b1dd101231d277ad724c40c788f6fdd8 depends: - __glibc >=2.17,<3.0.a0 - cffi >=2.0 - libgcc >=14 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1926884 - timestamp: 1777966253398 + size: 1930691 + timestamp: 1781385496617 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 md5: ce96f2f470d39bd96ce03945af92e280 @@ -316,77 +407,319 @@ packages: license: AFL-2.1 OR GPL-2.0-or-later size: 447649 timestamp: 1764536047944 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 - md5: b38117a3c920364aff79f870c984b4a3 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda + sha256: def3b2566a1702fa083a8984753ac0b3e3f7381048f88714e03d55b7bd930b74 + md5: 2c3958e02221c2504ec036139e648d8b depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: LGPL-2.1-or-later - size: 134088 - timestamp: 1754905959823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 - md5: fb53fb07ce46a575c5d004bbc96032c2 + - python >=3.10 + - python + license: LGPL-3.0-only + license_family: LGPL + size: 459540 + timestamp: 1779967837277 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 depends: - - __glibc >=2.17,<3.0.a0 - - keyutils >=1.6.3,<2.0a0 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - libgcc >=14 - - libstdcxx >=14 - - openssl >=3.5.5,<4.0a0 + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python license: MIT license_family: MIT - size: 1386730 - timestamp: 1769769569681 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c - md5: 18335a698559cdbcd86150a48bf54ba6 + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 + md5: b395909221b9bd1df066e5930e18855b depends: - - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-64 2.45.1 - license: GPL-3.0-only - license_family: GPL - size: 728002 - timestamp: 1774197446916 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 - md5: c277e0a4d549b03ac1e9d6cbbe3d017b + - python >=3.10 + license: MIT + license_family: MIT + size: 32884 + timestamp: 1782283986153 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac depends: - - ncurses - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause + - python >=3.9 + license: MIT + license_family: MIT + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda + sha256: 54c80a4ca6e6a19b4bb89c829f757d0de00362a3bfa4647517d2ebd519717f0f + md5: 563a022fc58cf7a200c35cb3fee07a6b + depends: + - python >=3.10 + - urllib3 >=2,<3 + - python + license: Apache-2.0 + license_family: APACHE + size: 27972 + timestamp: 1770237711404 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + sha256: c75632ea624aa450a394f570749420c5a2e0997d0216bc29d5d45b0f39df0426 + md5: 577b04680ae422adb86fc60d7b940659 + depends: + - python >=3.10 + - python + license: BSD-3-Clause license_family: BSD - size: 134676 - timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 - md5: a3b390520c563d78cc58974de95a03e5 + size: 163869 + timestamp: 1781620148226 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda + sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 + md5: ffc17e785d64e12fc311af9184221839 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + size: 34766 + timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a + md5: 0ba6225c279baf7ea9473a62ea0ec9ae + depends: + - python >=3.10 + - zipp >=3.1.0 constrains: - - expat 2.8.0.* + - importlib-resources >=7.1.0,<7.1.1.0a0 + license: Apache-2.0 + license_family: APACHE + size: 34809 + timestamp: 1776068839274 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda + sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 + md5: d59568bad316413c89831456e691de29 + depends: + - python >=3.10 + - more-itertools + - python license: MIT license_family: MIT - size: 77241 - timestamp: 1777846112704 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 - md5: a360c33a5abe61c07959e449fa1453eb + size: 14831 + timestamp: 1767294269456 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda + sha256: 108b3919db8ef81b5585b38a3fedbe9eeccdf8fa576c250a13559a1188f597cc + md5: b9d2b1ffa307961f6bb7d83c8ba8a8be depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - python >=3.10 + - backports.tarfile + - python license: MIT license_family: MIT - size: 58592 - timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + size: 16222 + timestamp: 1776862415793 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda + sha256: d23b9e8e8d5968699ec2bc9f8d182598e86e494dbe8a3a71b4a53b1be9a3cb16 + md5: 8665b873062a31a90b563bf493f9fb2c + depends: + - python >=3.10 + - more-itertools + - python + license: MIT + license_family: MIT + size: 18997 + timestamp: 1784015600777 +- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + sha256: 00d37d85ca856431c67c8f6e890251e7cc9e5ef3724a0302b8d4a101f22aa27f + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 40015 + timestamp: 1740828380668 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a + md5: b38fe4e78ee75def7e599843ef4c1ab0 + depends: + - __unix + - python + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + size: 65503 + timestamp: 1760643864586 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda + sha256: 9def5c6fb3b3b4952a4f6b55a019b5c7065b592682b84710229de5a0b73f6364 + md5: c88f9579d08eb4031159f03640714ce3 + depends: + - __osx + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - python >=3.10 + license: MIT + license_family: MIT + size: 37924 + timestamp: 1763320995459 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda + sha256: 010718b1b1a35ce72782d38e6d6b9495d8d7d0dbea9a3e42901d030ff2189545 + md5: 9eeb0eaf04fa934808d3e070eebbe630 + depends: + - __linux + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - jeepney >=0.4.2 + - python >=3.10 + - secretstorage >=3.2 + license: MIT + license_family: MIT + size: 37717 + timestamp: 1763320674488 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + sha256: 9b07046870772f28740e3f6149f09ff222843733087a33c5540b169c6289652d + md5: 54157a1c8c0bb70f62dd0b17fba7e7f2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + size: 1388990 + timestamp: 1781859420533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 + md5: 8780f41b013d19219faef9c82260744b + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + size: 1159780 + timestamp: 1781859501654 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + sha256: 27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec + md5: 449500f2c089da11c40f5c21312e3e07 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.46.1 + license: GPL-3.0-only + license_family: GPL + size: 745303 + timestamp: 1784214507189 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef + md5: 89f76a2a21a3ec3ec983b5eb237c4113 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 569349 + timestamp: 1781670209146 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 + md5: b24d3c612f71e7aa74158d92106318b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + size: 77856 + timestamp: 1781203599810 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f + md5: a915151d5d3c5bf039f5ccc8402a436f + depends: + - __osx >=11.0 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + size: 69362 + timestamp: 1781203631990 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + size: 58592 + timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 md5: 57736f29cc2b0ec0b6c2952d3f101b6a depends: @@ -399,21 +732,21 @@ packages: license_family: GPL size: 1041084 timestamp: 1778269013026 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda - sha256: 33eb5d5310a5c2c0a4707a0afa644801c2e08c8f70c45e1f62f354116dfe0970 - md5: 17d484ab9c8179c6a6e5b7dbb5065afc +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda + sha256: 4bee10e62796f01e4fa2b5849135b1cc061337fe9cf5eb9bd79e9664922ae0e4 + md5: 889febc66cd9e4190f80ef9718fa239b depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - libffi >=3.5.2,<3.6.0a0 - pcre2 >=10.47,<10.48.0a0 - - libzlib >=1.3.2,<2.0a0 - - libiconv >=1.18,<2.0a0 constrains: - glib >2.66 license: LGPL-2.1-or-later - size: 4754097 - timestamp: 1778508800134 + size: 4754220 + timestamp: 1782463895250 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b md5: faac990cb7aedc7f3a2224f2c9b0c26c @@ -443,6 +776,16 @@ packages: license: 0BSD size: 113478 timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + size: 92472 + timestamp: 1775825802659 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 md5: 2c21e66f50753a083cbe6b80f38268fa @@ -453,25 +796,51 @@ packages: license_family: BSD size: 92400 timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 - md5: 7af961ef4aa2c1136e11dd43ded245ab +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 73690 + timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + sha256: b677bbf1c339d894757c3dcfbb2f88649e499e4991d70ae09a1466da9a6c92d6 + md5: 965e4d531b588b2e42f66fd8e48b056c depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libgcc >=14 license: ISC - size: 277661 - timestamp: 1772479381288 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda - sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d - md5: 7dc38adcbf71e6b38748e919e16e0dce + size: 269272 + timestamp: 1779163468406 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + sha256: 202be45db5726757a8ea1f374f85aacc18c504f5ff15b2558496dff4c8779c48 + md5: 9ed5ab909c449bdcae72322e44875a18 + depends: + - __osx >=11.0 + license: ISC + size: 247352 + timestamp: 1779164136206 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + sha256: 365376f4815e5e80def2b3462a2419708b7c292da0da85278386c2618621fff4 + md5: 4aed8e657e9ff156bdbe849b4df44389 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing - size: 954962 - timestamp: 1777986471789 + size: 962119 + timestamp: 1782519076616 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda + sha256: a73a8acd97a6599fd6e561514db9f101ca7fd984cdc0cfd91ba74c8aa9dbe067 + md5: 7184d95871a58b8258a8ea124ed5aabc + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: blessing + size: 924912 + timestamp: 1782519136322 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc md5: 5794b3bdc38177caf969dabd3af08549 @@ -484,16 +853,16 @@ packages: license_family: GPL size: 5852044 timestamp: 1778269036376 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 - md5: 38ffe67b78c9d4de527be8315e5ada2c +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f + md5: 01bb81d12c957de066ea7362007df642 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 license: BSD-3-Clause license_family: BSD - size: 40297 - timestamp: 1775052476770 + size: 40017 + timestamp: 1781625522462 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 md5: d87ff7921124eccd67248aa483c23fec @@ -505,42 +874,205 @@ packages: license_family: Other size: 63629 timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 - md5: fc21868a1a5aacc937e7a18747acb8a5 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: X11 AND BSD-3-Clause - size: 918956 - timestamp: 1777422145199 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.5-py310hd8a072f_1.conda + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f + md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 + depends: + - mdurl >=0.1,<1 + - python >=3.10 + license: MIT + license_family: MIT + size: 69017 + timestamp: 1778169663339 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026071805-release.conda noarch: python - sha256: 3bb2aa2bf8758f4f1269fa36d67020e4f25199366773e2b73164456ce9286dc3 - md5: 8719dd226e9a128bd10033746e2418c6 + sha256: 16c6f9b9ce4ba4b6578c81ddeda3cb8bc45b4a4685b13af7cd97759ca1884fb4 + md5: 08746e347a297a5fa0dbe962ef113189 depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __glibc >=2.17 + - python >=3.10 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - tomli >=1.1.0 + license: LicenseRef-Modular-Proprietary + size: 135951 + timestamp: 1784354031113 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 license: MIT license_family: MIT - size: 678701 - timestamp: 1777219093168 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb - md5: da1b85b6a87e141f5140bb9924cecab0 + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026071805-release.conda + sha256: a447ea9cb950f63f0f9fa829dce0ee62163c85abfb43090d092f11c997801bfb + md5: d09f79f9cf3b0daab339b5ea3482a438 depends: - - __glibc >=2.17,<3.0.a0 + - python >=3.10 + - mojo-compiler ==1.0.0b3.dev2026071805 + - mblack ==26.5.0.dev2026071805 + - jupyter_client >=8.6.2,<8.7 + license: LicenseRef-Modular-Proprietary + size: 114468481 + timestamp: 1784354161905 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026071805-release.conda + sha256: 4bf774f0246278ceb551ea203325511399de7f778a3dab0376aa05f1241c8665 + md5: c1e05f12545f69667a1c2b046d8d6ce4 + depends: + - python >=3.10 + - mojo-compiler ==1.0.0b3.dev2026071805 + - mblack ==26.5.0.dev2026071805 + - jupyter_client >=8.6.2,<8.7 + license: LicenseRef-Modular-Proprietary + size: 100053333 + timestamp: 1784354697042 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026071805-release.conda + sha256: dc583f66a63993c6b3356dc5825bd5756c90ba915acf37a20465c4d37a009e6d + md5: f52d13f5f50da9e6d925ddb284d76f9a + depends: + - mojo-python ==1.0.0b3.dev2026071805 + license: LicenseRef-Modular-Proprietary + size: 81673708 + timestamp: 1784354208011 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026071805-release.conda + sha256: 5b6a36621665bcee424a2f1c97bc28273fed59fa9645024214266dd89a3909cb + md5: df9a376c6fe97bdd240d00d7bdd3ae34 + depends: + - mojo-python ==1.0.0b3.dev2026071805 + license: LicenseRef-Modular-Proprietary + size: 63146749 + timestamp: 1784354373058 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026071805-release.conda + noarch: python + sha256: 8f80b9cfda33cf011195dec5ca19a14d74dc57fcc535b8e5f206a9c2cee9e010 + md5: e0075d7c44be89035c68339a092c2b50 + depends: + - python >=3.10 + license: LicenseRef-Modular-Proprietary + size: 24110 + timestamp: 1784354031288 +- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda + sha256: 6725c1c8db9d025db763e1bba1acdcff2eb2ae20a7766a71512ea84081033288 + md5: 0e694257dbf916540b749c3ffc808efe + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 71270 + timestamp: 1779478190496 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11766 + timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: X11 AND BSD-3-Clause + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda + noarch: python + sha256: 9c651938be7eef8a3d10387a555ad07feea9345750ef0eb09cf5ac70c3a827b0 + md5: 406e98fd1fba273c9fc83bbc83d12033 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 672346 + timestamp: 1782129862714 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda + noarch: python + sha256: ce2cbbab1b433212f3f40c5d8d123c8ea24b1e8cb20abf13b5dc7522c9f7db69 + md5: 2360c27e16dbf61e6da6993a858d8d45 + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 629436 + timestamp: 1782129869826 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b + md5: 79dd2074b5cd5c5c6b2930514a11e22d + depends: + - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3167099 - timestamp: 1775587756857 + size: 3159683 + timestamp: 1781069855778 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb + md5: 8187a86242741725bfa74785fe812979 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3102584 + timestamp: 1781069820667 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 + md5: 4c06a92e74452cfa53623a81592e8934 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + size: 91574 + timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 + md5: 11adc78451c998c0fd162584abfa3559 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + size: 56559 + timestamp: 1777271601895 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff md5: 7a3bff861a6583f1889021facefc08b1 @@ -553,62 +1085,184 @@ packages: license_family: BSD size: 1222481 timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d + md5: 2c5ef45db85d34799771629bd5860fd7 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 26308 + timestamp: 1779972894916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 + md5: 9c5491066224083c41b6d5635ed7107b + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + size: 55886 + timestamp: 1779293633166 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 16c18772b340887160c79a6acc022db0 + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + size: 893031 + timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 + md5: d4582021af437c931d7d77ec39007845 + depends: + - python >=3.9 + - tomli >=1.1.0 + license: MIT + license_family: MIT + size: 15528 + timestamp: 1733710122949 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda build_number: 100 - sha256: dec247c5badc811baa34d6085df9d0465535883cf745e22e8d79092ad54a3a7b - md5: a443f87920815d41bfe611296e507995 + sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 + md5: 0b9b2f83b5b600e1ac38becde8d0dd44 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.5,<3.0a0 + - libexpat >=2.8.1,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - - liblzma >=5.8.2,<6.0a0 + - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.52.0,<4.0a0 - - libuuid >=2.42,<3.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libuuid >=2.42.1,<3.0a0 - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.6,<4.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 36705460 - timestamp: 1775614357822 + size: 36717183 + timestamp: 1781255094700 python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d - md5: 2035f68f96be30dc60a5dfd7452c7941 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + build_number: 100 + sha256: 984081c9fae3a3944c6f2707bbbbc70e8b961f02cdb7c640d9745e2636235632 + md5: 4841be3d0cf616a860efc6e60af66f8b depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 - python_abi 3.14.* *_cp314 - - yaml >=0.2.5,<0.3.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 14059371 + timestamp: 1781254578985 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda + sha256: eb8d5e44fddee9033eb7cfdd5ea584b7594b50e31c7602bef553af0fd4ee9266 + md5: fa587158c0d768127faa1a3b4df01e5d + depends: + - python >=3.10 + - colorama + - importlib-metadata >=4.6 + - packaging >=24.0 + - pyproject_hooks + - tomli >=1.1.0 + - python + constrains: + - build <0 license: MIT license_family: MIT - size: 202391 - timestamp: 1770223462836 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + size: 28946 + timestamp: 1778048948266 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + sha256: 84c129bdd6abcecac42a948f2670d17fe735d02d3a5a483a9b1f1bc33ba38c28 + md5: 224f69f177eb5aae6c9a6052846bf609 + depends: + - cpython 3.14.6.* + - python_abi * *_cp314 + license: Python-2.0 + size: 49315 + timestamp: 1781254664376 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda noarch: python - sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 - md5: 082985717303dab433c976986c674b35 + sha256: 970b2a1d12983d8d1cc05d914ad88a0b6ef1fa14038c9649aa834dd6ebee65d7 + md5: acd216255e1370e9aeab5351b831f07c depends: - python - libgcc >=14 - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.12 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 210896 + timestamp: 1779483879367 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda + noarch: python + sha256: 086cc67ec57afb7c9c09b5e09e7356b536b5b1af6c2e97117dc022cd22f0d472 + md5: 73f22bde4991f30ae2bfac3811577c15 + depends: + - python + - libcxx >=19 + - __osx >=11.0 - zeromq >=4.3.5,<4.4.0a0 - _python_abi3_support 1.* - cpython >=3.12 license: BSD-3-Clause license_family: BSD - size: 211567 - timestamp: 1771716961404 + size: 191432 + timestamp: 1779484184540 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -620,644 +1274,49 @@ packages: license_family: GPL size: 345073 timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.12-h994f30f_0.conda - noarch: python - sha256: 98c771464ed93a2733bae460c39cfa9640feb20972d2e651b44e85db296942eb - md5: 3c8f229055ad244fa3a97c6c45b77099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - size: 9266480 - timestamp: 1778119386343 -- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda - sha256: f6883925a130126cdbdc62c2f43513db53c9f889cde4abc3bc66542336a87150 - md5: 54452085855583ccc3cc5dcd17b47ffe + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda + sha256: 352b0c6b8c9d25cb16518420e45eae8a3be6718c924c747032a5c6578851b4c9 + md5: be7d616ec4d4e8eec1e4b3f3fe144af4 depends: - - cryptography >=2.0 - - dbus - - jeepney >=0.6 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 34098 - timestamp: 1763045408414 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac - md5: cffd3bdd58090148f4cfcd831f4b26ab + - nh3 >=0.2.14 + - comrak >=0.0.11 + - docutils >=0.21.2 + - pygments >=2.5.1 + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + size: 22324 + timestamp: 1781105511621 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - size: 3301196 - timestamp: 1769460227866 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_0.conda - sha256: ed8d06093ff530a2dae9ed1e51eb6f908fbfd171e8b62f4eae782d67b420be5a - md5: dc1ff1e915ab35a06b6fa61efae73ab5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - chardet >=3.0.2,<8 license: Apache-2.0 - license_family: Apache - size: 912476 - timestamp: 1774358032579 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda - sha256: c84034056dc938c853e4f61e72e5bd37e2ec91927a661fb9762f678cbea52d43 - md5: 5d3c008e54c7f49592fca9c32896a76f - depends: - - __glibc >=2.17,<3.0.a0 - - cffi - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 15004 - timestamp: 1769438727085 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad - md5: a77f85f77be52ff59391544bfe73390a - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - size: 85189 - timestamp: 1753484064210 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6 - md5: 755b096086851e1193f3b10347415d7c - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - krb5 >=1.22.2,<1.23.0a0 - - libsodium >=1.0.21,<1.0.22.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 311150 - timestamp: 1772476812121 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 601375 - timestamp: 1764777111296 -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 - md5: aaa2a381ccc56eac91d63b6c1240312f - depends: - - cpython - - python-gil - license: MIT - license_family: MIT - size: 8191 - timestamp: 1744137672556 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 - md5: 767d508c1a67e02ae8f50e44cacfadb2 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 7069 - timestamp: 1733218168786 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - sha256: 25abdb37e186f0d6ac3b774a63c81c5bc4bf554b5096b51343fa5e7c381193b1 - md5: bea46844deb274b2cc2a3a941745fa73 - depends: - - python >=3.10 - - backports - - python - license: MIT - license_family: MIT - size: 35739 - timestamp: 1767290467820 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - noarch: generic - sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe - md5: 1133126d840e75287d83947be3fc3e71 - depends: - - python >=3.14 - license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 7533 - timestamp: 1778594057496 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d - md5: e18ad67cf881dcadee8b8d9e2f8e5f73 - depends: - - __unix - license: ISC - size: 131039 - timestamp: 1776865545798 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda - sha256: 989db6e5957c4b44fa600c68c681ec2f36a55e48f7c7f1c073d5e91caa8cd878 - md5: 929471569c93acefb30282a22060dcd5 - depends: - - python >=3.10 - license: ISC - size: 135656 - timestamp: 1776866680878 -- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 - md5: 381bd45fb7aa032691f3063aff47e3a1 - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 13589 - timestamp: 1763607964133 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 - md5: a9167b9571f3baa9d448faa2139d1089 - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 58872 - timestamp: 1775127203018 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda - sha256: 37a5d8b10ea3516e2c42f870c9c351b9f7b31ff48c66d83490039f417e1e5228 - md5: 2266262ce8a425ecb6523d765f79b303 - depends: - - __unix - - python - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - size: 100048 - timestamp: 1777219902525 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 27011 - timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - noarch: generic - sha256: 40dc224f2b718e5f034efd2332bc315a719063235f63673468d26a24770094ee - md5: f111d4cfaf1fe9496f386bc98ae94452 - depends: - - python >=3.14,<3.15.0a0 - - python_abi * *_cp314 - license: Python-2.0 - size: 49809 - timestamp: 1775614256655 -- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - sha256: e2753997b8bd34205f42be01b8bab8037423dc30c02a1ec12de23e5b4c0b0a2e - md5: 58638f77697c4f6726753eb8be34818b - depends: - - python >=3.10 - - python - license: Apache-2.0 - license_family: APACHE - size: 303705 - timestamp: 1781320269259 -- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e - md5: d6bd3cd217e62bbd7efe67ff224cd667 - depends: - - python >=3.10 - license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 - size: 438002 - timestamp: 1766092633160 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda - sha256: 5476fe77cc2f59389dd348135462892dc20f42114301221648df90a6e9650186 - md5: 977e2b00d5329b6d56ebe94ae1f4b67c - depends: - - python >=3.10 - license: Unlicense - size: 77939 - timestamp: 1785376409053 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 - depends: - - python >=3.10 - - hyperframe >=6.1,<7 - - hpack >=4.1,<5 - - python - license: MIT - license_family: MIT - size: 95967 - timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba - md5: 0a802cb9888dd14eeefc611f05c40b6e - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 30731 - timestamp: 1737618390337 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 17397 - timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - sha256: 54c80a4ca6e6a19b4bb89c829f757d0de00362a3bfa4647517d2ebd519717f0f - md5: 563a022fc58cf7a200c35cb3fee07a6b - depends: - - python >=3.10 - - urllib3 >=2,<3 - - python - license: Apache-2.0 - license_family: APACHE - size: 27972 - timestamp: 1770237711404 -- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 - md5: 84a3233b709a289a4ddd7a2fd27dd988 - depends: - - python >=3.10 - - ukkonen - license: MIT - license_family: MIT - size: 79757 - timestamp: 1776455344188 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda - sha256: 9ab620e6f64bb67737bd7bc1ad6f480770124e304c6710617aba7fe60b089f48 - md5: fb7130c190f9b4ec91219840a05ba3ac - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 59038 - timestamp: 1776947141407 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 - md5: 080594bf4493e6bae2607e65390c520a - depends: - - python >=3.10 - - zipp >=3.20 - - python - license: Apache-2.0 - license_family: APACHE - size: 34387 - timestamp: 1773931568510 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a - md5: 0ba6225c279baf7ea9473a62ea0ec9ae - depends: - - python >=3.10 - - zipp >=3.1.0 - constrains: - - importlib-resources >=7.1.0,<7.1.1.0a0 - license: Apache-2.0 - license_family: APACHE - size: 34809 - timestamp: 1776068839274 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 - md5: d59568bad316413c89831456e691de29 - depends: - - python >=3.10 - - more-itertools - - python - license: MIT - license_family: MIT - size: 14831 - timestamp: 1767294269456 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda - sha256: 108b3919db8ef81b5585b38a3fedbe9eeccdf8fa576c250a13559a1188f597cc - md5: b9d2b1ffa307961f6bb7d83c8ba8a8be - depends: - - python >=3.10 - - backports.tarfile - - python - license: MIT - license_family: MIT - size: 16222 - timestamp: 1776862415793 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.4.0-pyhcf101f3_1.conda - sha256: 6a91447b3bb4d7ae94cc0d77ed12617796629aee11111efe7ea43cbd0e113bda - md5: aa83cc08626bf6b613a3103942be8951 - depends: - - python >=3.10 - - more-itertools - - python - license: MIT - license_family: MIT - size: 18744 - timestamp: 1767294193246 -- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda - sha256: 00d37d85ca856431c67c8f6e890251e7cc9e5ef3724a0302b8d4a101f22aa27f - md5: b4b91eb14fbe2f850dd2c5fc20676c0d - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 40015 - timestamp: 1740828380668 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a - md5: 4ebae00eae9705b0c3d6d1018a81d047 - depends: - - importlib-metadata >=4.8.3 - - jupyter_core >=4.12,!=5.0.* - - python >=3.9 - - python-dateutil >=2.8.2 - - pyzmq >=23.0 - - tornado >=6.2 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 106342 - timestamp: 1733441040958 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a - md5: b38fe4e78ee75def7e599843ef4c1ab0 - depends: - - __unix - - python - - platformdirs >=2.5 - - python >=3.10 - - traitlets >=5.3 - - python - constrains: - - pywin32 >=300 - license: BSD-3-Clause - license_family: BSD - size: 65503 - timestamp: 1760643864586 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - sha256: 9def5c6fb3b3b4952a4f6b55a019b5c7065b592682b84710229de5a0b73f6364 - md5: c88f9579d08eb4031159f03640714ce3 - depends: - - __osx - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - python >=3.10 - license: MIT - license_family: MIT - size: 37924 - timestamp: 1763320995459 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda - sha256: 010718b1b1a35ce72782d38e6d6b9495d8d7d0dbea9a3e42901d030ff2189545 - md5: 9eeb0eaf04fa934808d3e070eebbe630 - depends: - - __linux - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - jeepney >=0.4.2 - - python >=3.10 - - secretstorage >=3.2 - license: MIT - license_family: MIT - size: 37717 - timestamp: 1763320674488 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f - md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 - depends: - - mdurl >=0.1,<1 - - python >=3.10 - license: MIT - license_family: MIT - size: 69017 - timestamp: 1778169663339 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 - md5: 592132998493b3ff25fd7479396e8351 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 14465 - timestamp: 1733255681319 -- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-pyhcf101f3_0.conda - sha256: 74f7b461e0f0e0709a0c8abb018de9ad885258b74790ffda1e750ac5ddde0a85 - md5: b874955758a30a37c78b82ea5cf78fdb - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 71254 - timestamp: 1775762492525 -- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 - md5: e9c622e0d00fa24a6292279af3ab6d06 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 11766 - timestamp: 1745776666688 -- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee - md5: eb52d14a901e23c39e9e7b4a1a5c015f - depends: - - python >=3.10 - - setuptools - license: BSD-3-Clause - license_family: BSD - size: 40866 - timestamp: 1766261270149 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 - md5: 4c06a92e74452cfa53623a81592e8934 - depends: - - python >=3.8 - - python - license: Apache-2.0 - license_family: APACHE - size: 91574 - timestamp: 1777103621679 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 - md5: 11adc78451c998c0fd162584abfa3559 - depends: - - python >=3.10 - license: MPL-2.0 - license_family: MOZILLA - size: 56559 - timestamp: 1777271601895 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 - md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 25862 - timestamp: 1775741140609 -- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda - sha256: d1d528a9933378ea3734f3ecac83ed4989dc5cba6c0427b237cf35228873a259 - md5: 5f7aee6aa51642db4b57a7a11611dda1 - depends: - - cfgv >=2.0.0 - - identify >=1.0.0 - - nodeenv >=0.11.1 - - python >=3.10 - - pyyaml >=5.1 - - virtualenv >=20.10.0 - license: MIT - license_family: MIT - size: 202254 - timestamp: 1784706397465 -- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 - md5: 12c566707c80111f9799308d9e265aef - depends: - - python >=3.9 - - python - license: BSD-3-Clause - license_family: BSD - size: 110100 - timestamp: 1733195786147 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 - md5: 16c18772b340887160c79a6acc022db0 - depends: - - python >=3.10 - license: BSD-2-Clause - license_family: BSD - size: 893031 - timestamp: 1774796815820 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 - md5: d4582021af437c931d7d77ec39007845 - depends: - - python >=3.9 - - tomli >=1.1.0 - license: MIT - license_family: MIT - size: 15528 - timestamp: 1733710122949 -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 - md5: 461219d1a5bd61342293efa2c0c90eac - depends: - - __unix - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 21085 - timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - sha256: eb8d5e44fddee9033eb7cfdd5ea584b7594b50e31c7602bef553af0fd4ee9266 - md5: fa587158c0d768127faa1a3b4df01e5d - depends: - - python >=3.10 - - colorama - - importlib-metadata >=4.6 - - packaging >=24.0 - - pyproject_hooks - - tomli >=1.1.0 - - python - constrains: - - build <0 - license: MIT - license_family: MIT - size: 28946 - timestamp: 1778048948266 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 - md5: 5b8d21249ff20967101ffa321cab24e8 - depends: - - python >=3.9 - - six >=1.5 - - python - license: Apache-2.0 - license_family: APACHE - size: 233310 - timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - sha256: df1023b39a323a753963f5f50028f0ded0385f37752a800105451463e64f597c - md5: 5fd6bf90409294513b84439f6c184ff2 - depends: - - python >=3.10 - - filelock >=3.15.4 - - platformdirs <5,>=4.3.6 - - python - license: MIT - license_family: MIT - size: 37229 - timestamp: 1785577890125 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda - sha256: 36ff7984e4565c85149e64f8206303d412a0652e55cf806dcb856903fa056314 - md5: e4e60721757979d01d3964122f674959 - depends: - - cpython 3.14.4.* - - python_abi * *_cp314 - license: Python-2.0 - size: 49806 - timestamp: 1775614307464 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - build_number: 8 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 - md5: 0539938c55b6b1a59b560e843ad864a4 - constrains: - - python 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 6989 - timestamp: 1752805904792 -- conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a - md5: c58dd5d147492671866464405364c0f1 - depends: - - cmarkgfm >=0.8.0 - - docutils >=0.21.2 - - nh3 >=0.2.14 - - pygments >=2.5.1 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 17481 - timestamp: 1734339765256 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda - sha256: 4487fdb341537e2df47159ed8e546add99080974c52d5b2dc2a710910619115a - md5: a5985537dab1ba7034b5ff4ea22e2fa9 - depends: - - python >=3.10 - - certifi >=2023.5.7 - - charset-normalizer >=2,<4 - - idna >=2.5,<4 - - urllib3 >=1.26,<3 - - python - constrains: - - chardet >=3.0.2,<8 - license: Apache-2.0 - license_family: APACHE - size: 68658 - timestamp: 1778534036810 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 - md5: 66de8645e324fda0ea6ef28c2f99a2ab + license_family: APACHE + size: 68709 + timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 + md5: 66de8645e324fda0ea6ef28c2f99a2ab depends: - python >=3.9 - requests >=2.0.1,<3.0.0 @@ -1266,457 +1325,235 @@ packages: size: 44285 timestamp: 1733734886897 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 - md5: 43e14f832d7551e5a8910672bfc3d8c6 - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 38028 - timestamp: 1733921806657 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a - md5: 0242025a3c804966bf71aa04eee82f66 - depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.10 - - typing_extensions >=4.0.0,<5.0.0 - - python - license: MIT - license_family: MIT - size: 208577 - timestamp: 1775991661559 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - sha256: 48a9f96016505debadfc67f06de7ac548decbc38d327409b24b0432ef6f16335 - md5: 6bf6acbab2499830180ec88c3aff2fa4 - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 642081 - timestamp: 1783619174976 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d - md5: 3339e3b65d58accf4ca4fb8748ab16b3 - depends: - - python >=3.9 - - python - license: MIT - license_family: MIT - size: 18455 - timestamp: 1753199211006 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd - md5: b5325cf06a000c5b14970462ff5e4d58 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 21561 - timestamp: 1774492402955 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - sha256: dfb681579be59c2e790c95f7f49b7529a9b0511d6385ad276e3c8988cbd54d2c - md5: 4bada6a6d908a27262af8ebddf4f7492 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 115165 - timestamp: 1778074251714 -- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb - md5: 901a86453fa6183e914b937643619a03 - depends: - - id - - importlib-metadata >=3.6 - - keyring >=21.2.0 - - packaging >=24.0 - - python >=3.10 - - readme_renderer >=35.0 - - requests >=2.20 - - requests-toolbelt >=0.8.0,!=0.9.0 - - rfc3986 >=1.4.0 - - rich >=12.0.0 - - urllib3 >=1.26.0 - - python - license: Apache-2.0 - license_family: APACHE - size: 42488 - timestamp: 1757013705407 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 - md5: 0caa1af407ecff61170c9437a808404d - depends: - - python >=3.10 - - python - license: PSF-2.0 - license_family: PSF - size: 51692 - timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c - md5: ad659d0a2b3e47e38d829aa8cad2d610 - license: LicenseRef-Public-Domain - size: 119135 - timestamp: 1767016325805 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 - md5: cbb88288f74dbe6ada1c6c7d0a97223e - depends: - - backports.zstd >=1.0.0 - - brotli-python >=1.2.0 - - h2 >=4,<5 - - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.10 - license: MIT - license_family: MIT - size: 103560 - timestamp: 1778188657149 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.1-pyhcf101f3_0.conda - sha256: 95a8f25bfa5505687d25913f20b1888e9512d9cd1ecc7776c1f4497654abeac2 - md5: a7e130692c42435160dd8a9071ea40d9 - depends: - - python >=3.10 - - distlib >=0.3.7,<1 - - filelock <4,>=3.24.2 - - importlib-metadata >=6.6 - - platformdirs >=3.9.1,<5 - - python-discovery >=1.4.2 - - typing_extensions >=4.13.2 - - python - license: MIT - license_family: MIT - size: 3742229 - timestamp: 1785500010854 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - sha256: 523616c0530d305d2216c2b4a8dfd3872628b60083255b89c5e0d8c42e738cca - md5: e1c36c6121a7c9c76f2f148f1e83b983 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 24461 - timestamp: 1776131454755 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 - md5: f9501812fe7c66b6548c7fcaa1c1f252 - depends: - - __osx >=11.0 - - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - constrains: - - libbrotlicommon 1.2.0 hc919400_1 - license: MIT - license_family: MIT - size: 359854 - timestamp: 1764018178608 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df - md5: 620b85a3f45526a8bc4d23fd78fc22f0 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - size: 124834 - timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98 - md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7 - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 292983 - timestamp: 1761203354051 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py314hb84d1df_1.conda - sha256: 17fd950dd391f5471210a3a0fcddd2a0b4d5affa6da67f9d9e01dd276192c856 - md5: 53a4b07a7da29004b99261d77798109c - depends: - - __osx >=11.0 - - cffi >=1.0.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 115970 - timestamp: 1760363189413 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed - md5: e446e1822f4da8e5080a9de93474184d - depends: - - __osx >=11.0 - - libcxx >=19 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT - size: 1160828 - timestamp: 1769770119811 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - sha256: dddd01bd6b338221342a89530a1caffe6051a70cc8f8b1d8bb591d5447a3c603 - md5: ff484b683fecf1e875dfc7aa01d19796 - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 569359 - timestamp: 1778191546305 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 - md5: 44083d2d2c2025afca315c7a172eab2b - depends: - - ncurses - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD - size: 107691 - timestamp: 1738479560845 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c - md5: 65466e82c09e888ca7560c11a97d5450 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + md5: 43e14f832d7551e5a8910672bfc3d8c6 depends: - - __osx >=11.0 - constrains: - - expat 2.8.0.* + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 38028 + timestamp: 1733921806657 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a + md5: 0242025a3c804966bf71aa04eee82f66 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python license: MIT license_family: MIT - size: 68789 - timestamp: 1777846180142 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 - md5: 43c04d9cb46ef176bb2a4c77e324d599 + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda + noarch: python + sha256: 2002c7869a95ed94b03303a033fcc24b608597bdd01c8f01d90c47175616edb9 + md5: ad7d8b2d37a1098a04ddd8b34b962481 depends: - - __osx >=11.0 + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - __glibc >=2.17 license: MIT - license_family: MIT - size: 40979 - timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e - md5: b1fd823b5ae54fbec272cea0811bd8a9 + size: 9333318 + timestamp: 1784237314764 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda + noarch: python + sha256: 56362f7c5150de1f01450fcb668dbd9c3f163e9f0f69f1f7c9da5bebd0d75172 + md5: 81fe5e5807d471fcd624bfb6bdb98968 depends: + - python - __osx >=11.0 constrains: - - xz 5.8.3.* - license: 0BSD - size: 92472 - timestamp: 1775825802659 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 - md5: 57c4be259f5e0b99a5983799a228ae55 - depends: - __osx >=11.0 - license: BSD-2-Clause + license: MIT + size: 8651168 + timestamp: 1784237480462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda + sha256: 1493aadd9fcb4894b879ea0e0e0eed4cb60a60a26bb95b821dcb6ea5def47d06 + md5: 2d7b5ae8ad713d8a7097a75a248f8ba3 + depends: + - cryptography >=2.0 + - dbus + - jeepney >=0.6 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause license_family: BSD - size: 73690 - timestamp: 1769482560514 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 - md5: 7cc5247987e6d115134ebab15186bc13 + size: 34939 + timestamp: 1780858492554 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 depends: - - __osx >=11.0 - license: ISC - size: 248039 - timestamp: 1772479570912 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 - md5: 6681822ea9d362953206352371b6a904 + - python >=3.9 + - python + license: MIT + license_family: MIT + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + build_number: 103 + sha256: 43624eab22f5f29df7d6ffe914cf442f28fd559b55b290906255492826e636e8 + md5: 48a1049e710857572fc2a832aa394d9f depends: - - __osx >=11.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - libzlib >=1.3.2,<2.0a0 - license: blessing - size: 920047 - timestamp: 1777987051643 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 - md5: bc5a5721b6439f2f62a84f2548136082 - depends: - - __osx >=11.0 constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 47759 - timestamp: 1774072956767 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d - md5: 343d10ed5b44030a2f67193905aea159 + - xorg-libx11 >=1.8.13,<2.0a0 + license: TCL + size: 3550916 + timestamp: 1784229071544 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + sha256: 47186bc7ab8d7e8bee86bbd1a917196f8c21cf63f081fc33cd6d1221af087580 + md5: 8e3cf0e455e6b54519f0b1c72c61780a depends: - __osx >=11.0 - license: X11 AND BSD-3-Clause - size: 805509 - timestamp: 1777423252320 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.5-py310h3b8a9b8_1.conda - noarch: python - sha256: 5932e04c48ab4e08452ea0e681969706d8b1d8574f3147a39577bec02eac38a7 - md5: 6337a614ffaf7f9383968196cf100601 + - libzlib >=1.3.2,<2.0a0 + license: TCL + size: 3338712 + timestamp: 1784229090530 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 depends: + - python >=3.10 - python - - __osx >=11.0 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __osx >=11.0 license: MIT license_family: MIT - size: 631222 - timestamp: 1777219210592 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea - md5: 25dcccd4f80f1638428613e0d7c9b4e1 + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + sha256: bbb7056f7c5fd606df16ed73ee68687050de2c02fd69a3f69a1cb533a7ed2ae8 + md5: 4a8e5889712641aabdf6695e292857fe depends: - - __osx >=11.0 - - ca-certificates + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 3106008 - timestamp: 1775587972483 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - build_number: 100 - sha256: 27e7d6cbe021f37244b643f06a98e46767255f7c2907108dd3736f042757ddad - md5: e1bc5a3015a4bbeb304706dba5a32b7f - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.5,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.52.0,<4.0a0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.6,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 13533346 - timestamp: 1775616188373 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 - md5: dcf51e564317816cb8d546891019b3ab + size: 918368 + timestamp: 1781006801436 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda + sha256: 1a4f3d940cf239acde2fc61674b7cf80219a7f22a369e92b95b245be2d47caf1 + md5: cc1d84777343f00f01c08a2d9550f639 depends: - __osx >=11.0 - python >=3.14,<3.15.0a0 - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 189475 - timestamp: 1770223788648 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - noarch: python - sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772 - md5: 2f6b79700452ef1e91f45a99ab8ffe5a + license: Apache-2.0 + license_family: Apache + size: 915857 + timestamp: 1781007345425 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431 + md5: 37e3be7b6e2977d37b8fa5da229f5dc0 depends: + - python >=3.10 - python - - libcxx >=19 - - __osx >=11.0 - - _python_abi3_support 1.* - - cpython >=3.12 - - zeromq >=4.3.5,<4.4.0a0 license: BSD-3-Clause license_family: BSD - size: 191641 - timestamp: 1771717073430 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 - md5: f8381319127120ce51e081dce4865cf4 - depends: - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 313930 - timestamp: 1765813902568 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.12-hbd3f8a3_0.conda - noarch: python - sha256: 91992a557456cbe9980e8ffb0f0d1200f65f741adeefc7ecf568d1935690a7bc - md5: 7151a0851207b88c0031f388a7825e9b + size: 115158 + timestamp: 1780507822178 +- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + md5: 901a86453fa6183e914b937643619a03 depends: + - id + - importlib-metadata >=3.6 + - keyring >=21.2.0 + - packaging >=24.0 + - python >=3.10 + - readme_renderer >=35.0 + - requests >=2.20 + - requests-toolbelt >=0.8.0,!=0.9.0 + - rfc3986 >=1.4.0 + - rich >=12.0.0 + - urllib3 >=1.26.0 - python - - __osx >=11.0 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 8485007 - timestamp: 1778119519471 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 - md5: a9d86bc62f39b94c4661716624eb21b0 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - size: 3127137 - timestamp: 1769460817696 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py314h6c2aa35_0.conda - sha256: 4ccc4a20d676c0ba85adee9c99015bec7f5b685df0cf8006e34573f1d6c2ce75 - md5: 3f81f8b2fe2c26a82c0abf57ab2b9610 - depends: - - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 license: Apache-2.0 - license_family: Apache - size: 910845 - timestamp: 1774358965067 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda - sha256: 033dbf9859fe58fb85350cf6395be6b1346792e1766d2d5acab538a6eb3659fb - md5: e229f444fbdb28d8c4f40e247154d993 + license_family: APACHE + size: 42488 + timestamp: 1757013705407 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 + md5: c70ad746c22219b9700931707482992c depends: - - __osx >=11.0 - - cffi - - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 14884 - timestamp: 1769439056290 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac - md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + size: 52631 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 + md5: fcb489df604d100968b737f2cb6076c6 + license: LicenseRef-Public-Domain + size: 118849 + timestamp: 1784250406640 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: cbb88288f74dbe6ada1c6c7d0a97223e depends: - - __osx >=11.0 + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 license: MIT license_family: MIT - size: 83386 - timestamp: 1753484079473 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868 - md5: e85dcd3bde2b10081cdcaeae15797506 + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + sha256: dc9f28dedcb5f35a127fad2d847674d2833369dd616d294e423b8997df31d8a8 + md5: 96b08867e21d4694fa5c2c226e6581b0 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 311184 + timestamp: 1779123989774 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda + sha256: 01fd50d2801b23b59fafea6bf704a6c5faf0f5969104400eae0e6572cb2e5304 + md5: d31c0e54c4f9c51100ec8c812ee925d1 depends: - - __osx >=11.0 - libcxx >=19 + - __osx >=11.0 - krb5 >=1.22.2,<1.23.0a0 - - libsodium >=1.0.21,<1.0.22.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 license: MPL-2.0 license_family: MOZILLA - size: 245246 - timestamp: 1772476886668 + size: 245404 + timestamp: 1779124076307 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 24190 + timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 601375 + timestamp: 1764777111296 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 md5: ab136e4c34e97f34fb621d2592a393d8 @@ -1727,81 +1564,3 @@ packages: license_family: BSD size: 433413 timestamp: 1764777166076 -- conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b2-release.conda - sha256: 7553366c138bae2fcf8617582f1bb6d6b6742087bd6a83ea83aa41c023499382 - md5: 8d4390edde2dcf29880c57b3088f15aa - depends: - - python >=3.10 - - mojo-compiler ==1.0.0b2 - - mblack ==26.4.0 - - jupyter_client >=8.6.2,<8.7 - license: LicenseRef-Modular-Proprietary - size: 96475709 - timestamp: 1781237127405 -- conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b2-release.conda - sha256: 87f8e9ef573f37072423aeb56a7c468bdb5f5889476bce4aa7c3396665c651fe - md5: 6be85d17872f5c2370015ca4ec07dd0d - depends: - - mojo-python ==1.0.0b2 - license: LicenseRef-Modular-Proprietary - size: 85342385 - timestamp: 1781237127405 -- conda: https://conda.modular.com/max/noarch/mblack-26.4.0-release.conda - noarch: python - sha256: e2497cbefbf5d962cd0db8c1b893e7e48d8f3603cab84a9d8bad0030b5bb26b1 - md5: ec6bf2b9588f5ba4bd3472c0773c4892 - depends: - - python >=3.10 - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9.0 - - platformdirs >=2 - - tomli >=1.1.0 - license: LicenseRef-Modular-Proprietary - size: 135301 - timestamp: 1781220755102 -- conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b2-release.conda - noarch: python - sha256: 37bf44a74edcd2ebaec7fe8299ef183e006ad051bfcf21caa06becc0e0eeffd5 - md5: 8781bd673909835fa59ce818e3835839 - depends: - - python >=3.10 - license: LicenseRef-Modular-Proprietary - size: 24682 - timestamp: 1781220753246 -- conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b2-release.conda - sha256: 39bb59a309af5e4c78c077263e5824e33bba8159a1e0fc39ff2786a1f9d5762b - md5: 1a6b6dd12763032e46b956407b39ab48 - depends: - - python >=3.10 - - mojo-compiler ==1.0.0b2 - - mblack ==26.4.0 - - jupyter_client >=8.6.2,<8.7 - license: LicenseRef-Modular-Proprietary - size: 84573003 - timestamp: 1781237324882 -- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b2-release.conda - sha256: 91c4d590a152ec2e26846955fcd7ec02796dfaffefa006a1c0c5790575be2051 - md5: cd8d3f4a22e5f14dd909d0d5570c4940 - depends: - - mojo-python ==1.0.0b2 - license: LicenseRef-Modular-Proprietary - size: 62655166 - timestamp: 1781237320083 -- conda: https://repo.prefix.dev/modular-community/linux-64/argmojo-0.7.0-hb0f4dca_0.conda - sha256: d1549ec978832a8c6a18454265ac4d89ad69e27967498fd175e6152174c4e6ab - md5: bc165382aa8c5dbf6a2c5b6c3d6c40e2 - depends: - - mojo-compiler 1.0.0b2.* - license: Apache-2.0 - size: 561359 - timestamp: 1782868006869 -- conda: https://repo.prefix.dev/modular-community/osx-arm64/argmojo-0.7.0-h60d57d3_0.conda - sha256: 602b2b28f33a480aee4fa789cacb2c9abf4e71ee9a73df072bcf3d9da04f2886 - md5: 0bf4d67c5f332d2ea61d613afd968a15 - depends: - - mojo-compiler 1.0.0b2.* - license: Apache-2.0 - size: 560821 - timestamp: 1782867689075 diff --git a/pixi.toml b/pixi.toml index cdfa7e38..97330d3c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,6 +1,6 @@ [workspace] authors = ["ZHU Yuhao (朱宇浩) "] -channels = ["https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "conda-forge"] +channels = ["https://conda.modular.com/max-nightly", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "conda-forge"] description = "An arbitrary-precision decimal and integer library for Mojo" license = "Apache-2.0" name = "decimo" @@ -9,8 +9,8 @@ readme = "README.md" version = "0.11.0" [dependencies] -argmojo = ">=0.7,<0.8" # CLI argument parsing for the Decimo calculator -mojo = ">=1.0.0b2,<2" # Mojo language compiler and runtime +# argmojo = ">=0.7,<0.8" # CLI argument parsing for the Decimo calculator +mojo = "*" # Mojo language compiler and runtime python = ">=3.13" # For Python bindings and tests python-build = ">=0.2.0" # Build PyPI wheel (`pixi run wheel`) ruff = ">=0.15.0" # Python code formatter diff --git a/src/decimo/bigdecimal/arithmetics.mojo b/src/decimo/bigdecimal/arithmetics.mojo index b1c62e0e..9b178bde 100644 --- a/src/decimo/bigdecimal/arithmetics.mojo +++ b/src/decimo/bigdecimal/arithmetics.mojo @@ -21,6 +21,8 @@ Implements functions for mathematical operations on BigDecimal objects. from std import math import decimo.biguint.arithmetics as biguint_arithmetics +from decimo.biguint.biguint import BigUInt +from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.bigdecimal.rounding import round_to_precision_inplace from decimo.errors import ZeroDivisionError from decimo.rounding_mode import RoundingMode diff --git a/src/decimo/bigdecimal/bigdecimal.mojo b/src/decimo/bigdecimal/bigdecimal.mojo index 2405a7b9..981ea938 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -41,6 +41,7 @@ import decimo.bigdecimal.exponential as bigdecimal_exponential import decimo.bigdecimal.rounding as bigdecimal_rounding import decimo.bigdecimal.special as bigdecimal_special import decimo.bigdecimal.trigonometric as bigdecimal_trigonometric +from decimo.biguint.biguint import BigUInt import decimo.biguint.arithmetics as biguint_arithmetics # Type aliases for the arbitrary-precision decimal type. diff --git a/src/decimo/bigdecimal/constants.mojo b/src/decimo/bigdecimal/constants.mojo index 9eb77d4c..33a7b127 100644 --- a/src/decimo/bigdecimal/constants.mojo +++ b/src/decimo/bigdecimal/constants.mojo @@ -20,6 +20,7 @@ from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.errors import ValueError from decimo.bigint10.bigint10 import BigInt10 +from decimo.biguint.biguint import BigUInt from decimo.rounding_mode import RoundingMode import decimo.bigdecimal.trigonometric as bigdecimal_trigonometric diff --git a/src/decimo/bigdecimal/exponential.mojo b/src/decimo/bigdecimal/exponential.mojo index 18bf43e4..0431b2bb 100644 --- a/src/decimo/bigdecimal/exponential.mojo +++ b/src/decimo/bigdecimal/exponential.mojo @@ -18,11 +18,12 @@ from std import math -import decimo.bigdecimal.arithmetics as bigdecimal_arithmetics +from decimo.biguint.biguint import BigUInt import decimo.biguint.arithmetics as biguint_arithmetics import decimo.biguint.exponential as biguint_exponential import decimo.decimal128.utility as decimal128_utility from decimo.bigdecimal.bigdecimal import BigDecimal +import decimo.bigdecimal.arithmetics as bigdecimal_arithmetics from decimo.errors import ValueError, OverflowError, ZeroDivisionError from decimo.rounding_mode import RoundingMode diff --git a/src/decimo/bigdecimal/rounding.mojo b/src/decimo/bigdecimal/rounding.mojo index b2b34550..0a68a75a 100644 --- a/src/decimo/bigdecimal/rounding.mojo +++ b/src/decimo/bigdecimal/rounding.mojo @@ -18,6 +18,7 @@ Implements functions for mathematical operations on Decimal objects. """ +from decimo.biguint.biguint import BigUInt from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.rounding_mode import RoundingMode diff --git a/src/decimo/bigdecimal/trigonometric.mojo b/src/decimo/bigdecimal/trigonometric.mojo index bcedcaa6..ef1b0699 100644 --- a/src/decimo/bigdecimal/trigonometric.mojo +++ b/src/decimo/bigdecimal/trigonometric.mojo @@ -23,6 +23,7 @@ operating on the arbitrary-precision BigDecimal type. from std import time +from decimo.biguint.biguint import BigUInt from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.errors import ValueError from decimo.rounding_mode import RoundingMode diff --git a/src/decimo/bigint/arithmetics.mojo b/src/decimo/bigint/arithmetics.mojo index e45587d9..e5d3b210 100644 --- a/src/decimo/bigint/arithmetics.mojo +++ b/src/decimo/bigint/arithmetics.mojo @@ -33,7 +33,7 @@ Algorithms: (< CUTOFF_BURNIKEL_ZIEGLER words). Single-word fast path for UInt32 divisors. """ -from std.memory import memcpy, memset_zero +from std.memory import unsafe_memcpy, memset_zero from decimo.bigint.bigint import BigInt from decimo.bigint.comparison import compare_magnitudes @@ -95,10 +95,10 @@ def _add_magnitudes(a: List[UInt32], b: List[UInt32]) -> List[UInt32]: def _add_magnitudes_into( mut result: List[UInt32], - read a: List[UInt32], + imm a: List[UInt32], a_start: Int, a_end: Int, - read b: List[UInt32], + imm b: List[UInt32], b_start: Int, b_end: Int, ): @@ -211,7 +211,7 @@ def _multiply_magnitudes(a: List[UInt32], b: List[UInt32]) -> List[UInt32]: def _multiply_magnitude_by_word( - read a: List[UInt32], a_start: Int, a_end: Int, w: UInt32 + imm a: List[UInt32], a_start: Int, a_end: Int, w: UInt32 ) -> List[UInt32]: """Multiplies a magnitude slice by a single UInt32 word. @@ -239,13 +239,13 @@ def _multiply_magnitude_by_word( var carry: UInt64 = 0 var w64 = UInt64(w) - var ap = a._data + a_start + var ap = a._data.unsafe_offset(a_start) var rp = result._data for i in range(len_a): - var product = UInt64(ap[i]) * w64 + carry - rp[i] = UInt32(product & 0xFFFF_FFFF) + var product = UInt64(ap[unsafe_offset=i]) * w64 + carry + rp[unsafe_offset=i] = UInt32(product & 0xFFFF_FFFF) carry = product >> 32 - rp[len_a] = UInt32(carry) + rp[unsafe_offset=len_a] = UInt32(carry) # Strip leading zeros var rlen = len_a + 1 @@ -258,10 +258,10 @@ def _multiply_magnitude_by_word( def _multiply_magnitudes_schoolbook( - read a: List[UInt32], + imm a: List[UInt32], a_start: Int, a_end: Int, - read b: List[UInt32], + imm b: List[UInt32], b_start: Int, b_end: Int, ) -> List[UInt32]: @@ -299,14 +299,18 @@ def _multiply_magnitudes_schoolbook( if ai == 0: continue var carry: UInt64 = 0 - var rp = result._data + i - var bp = b._data + b_start + var rp = result._data.unsafe_offset(i) + var bp = b._data.unsafe_offset(b_start) for j in range(len_b): - var product = ai * UInt64(bp[j]) + UInt64(rp[j]) + carry - rp[j] = UInt32(product & 0xFFFF_FFFF) + var product = ( + ai * UInt64(bp[unsafe_offset=j]) + + UInt64(rp[unsafe_offset=j]) + + carry + ) + rp[unsafe_offset=j] = UInt32(product & 0xFFFF_FFFF) carry = product >> 32 if carry > 0: - rp[len_b] = UInt32(carry) + rp[unsafe_offset=len_b] = UInt32(carry) # Strip leading zeros while result_len > 1 and result[result_len - 1] == 0: @@ -318,10 +322,10 @@ def _multiply_magnitudes_schoolbook( def _multiply_magnitudes_karatsuba( - read a: List[UInt32], + imm a: List[UInt32], a_start: Int, a_end: Int, - read b: List[UInt32], + imm b: List[UInt32], b_start: Int, b_end: Int, ) -> List[UInt32]: @@ -472,10 +476,10 @@ def _multiply_magnitudes_karatsuba( def _add_slices( - read a: List[UInt32], + imm a: List[UInt32], a_start: Int, a_end: Int, - read b: List[UInt32], + imm b: List[UInt32], b_start: Int, b_end: Int, ) -> List[UInt32]: @@ -503,18 +507,18 @@ def _add_slices( result[len_max] = UInt32(0) var carry: UInt64 = 0 - var ap = a._data + a_start - var bp = b._data + b_start + var ap = a._data.unsafe_offset(a_start) + var bp = b._data.unsafe_offset(b_start) var rp = result._data for i in range(len_max): - var ai: UInt64 = UInt64(ap[i]) if i < len_a else 0 - var bi: UInt64 = UInt64(bp[i]) if i < len_b else 0 + var ai: UInt64 = UInt64(ap[unsafe_offset=i]) if i < len_a else 0 + var bi: UInt64 = UInt64(bp[unsafe_offset=i]) if i < len_b else 0 var s = ai + bi + carry - rp[i] = UInt32(s & 0xFFFF_FFFF) + rp[unsafe_offset=i] = UInt32(s & 0xFFFF_FFFF) carry = s >> 32 if carry > 0: - rp[len_max] = UInt32(carry) + rp[unsafe_offset=len_max] = UInt32(carry) else: while len(result) > len_max: result.shrink(len(result) - 1) @@ -522,7 +526,7 @@ def _add_slices( return result^ -def _add_magnitudes_inplace(mut a: List[UInt32], read b: List[UInt32]): +def _add_magnitudes_inplace(mut a: List[UInt32], imm b: List[UInt32]): """Adds magnitude b into a in-place: a += b. Grows a if needed to accommodate the sum. @@ -565,7 +569,7 @@ def _add_magnitudes_inplace(mut a: List[UInt32], read b: List[UInt32]): def _add_at_offset_inplace( - mut a: List[UInt32], read b: List[UInt32], offset: Int + mut a: List[UInt32], imm b: List[UInt32], offset: Int ): """Adds magnitude b into a at a word offset: a[offset:] += b. @@ -579,11 +583,13 @@ def _add_at_offset_inplace( """ var len_b = len(b) var carry: UInt64 = 0 - var ap = a._data + offset + var ap = a._data.unsafe_offset(offset) var bp = b._data for i in range(len_b): - var s = UInt64(ap[i]) + UInt64(bp[i]) + carry - ap[i] = UInt32(s & 0xFFFF_FFFF) + var s = ( + UInt64(ap[unsafe_offset=i]) + UInt64(bp[unsafe_offset=i]) + carry + ) + ap[unsafe_offset=i] = UInt32(s & 0xFFFF_FFFF) carry = s >> 32 # Propagate remaining carry var j = len_b @@ -594,7 +600,7 @@ def _add_at_offset_inplace( j += 1 -def _subtract_magnitudes_inplace(mut a: List[UInt32], read b: List[UInt32]): +def _subtract_magnitudes_inplace(mut a: List[UInt32], imm b: List[UInt32]): """Subtracts magnitude b from a in-place: a -= b. Assumes a >= b. Used by Karatsuba where this is guaranteed by construction. @@ -610,15 +616,15 @@ def _subtract_magnitudes_inplace(mut a: List[UInt32], read b: List[UInt32]): var ap = a._data var bp = b._data for i in range(len_a): - var ai = UInt64(ap[i]) - var bi: UInt64 = UInt64(bp[i]) if i < len_b else 0 + var ai = UInt64(ap[unsafe_offset=i]) + var bi: UInt64 = UInt64(bp[unsafe_offset=i]) if i < len_b else 0 var diff = ai - bi - borrow if ai < bi + borrow: diff += BigInt.BASE borrow = 1 else: borrow = 0 - ap[i] = UInt32(diff & 0xFFFF_FFFF) + ap[unsafe_offset=i] = UInt32(diff & 0xFFFF_FFFF) # Strip leading zeros while len(a) > 1 and a[len(a) - 1] == 0: @@ -650,7 +656,7 @@ def _shift_left_words_inplace(mut a: List[UInt32], n: Int): # (destination is always at higher address, so backward is overlap-safe) var p = a._data for i in range(old_len - 1, -1, -1): - p[i + n] = p[i] + p[unsafe_offset=i + n] = p[unsafe_offset=i] # Fill the first n words with zeros memset_zero(ptr=a._data, count=n) @@ -995,7 +1001,9 @@ def _get_words_slice(a: List[UInt32], start: Int, end: Int) -> List[UInt32]: var len_slice = actual_end - start var result = List[UInt32](capacity=len_slice) result.resize(unsafe_uninit_length=len_slice) - memcpy(dest=result._data, src=a._data + start, count=len_slice) + unsafe_memcpy( + dest=result._data, src=a._data.unsafe_offset(start), count=len_slice + ) # Strip leading zeros while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) @@ -1021,7 +1029,7 @@ def _is_zero_in_range(a: List[UInt32], start: Int, end: Int) -> Bool: def _add_from_slice_inplace( - mut a: List[UInt32], read b: List[UInt32], b_start: Int, b_end: Int + mut a: List[UInt32], imm b: List[UInt32], b_start: Int, b_end: Int ): """Adds b[b_start:b_end] into a in-place: a += b[b_start:b_end]. @@ -1068,10 +1076,10 @@ def _add_from_slice_inplace( def _multiply_magnitudes_slices( - read a: List[UInt32], + imm a: List[UInt32], a_start: Int, a_end: Int, - read b: List[UInt32], + imm b: List[UInt32], b_start: Int, b_end: Int, ) -> List[UInt32]: @@ -1115,10 +1123,10 @@ def _decrement_inplace(mut a: List[UInt32]): def _divmod_knuth_d_from_slices( - read a: List[UInt32], + imm a: List[UInt32], a_start: Int, a_end: Int, - read b: List[UInt32], + imm b: List[UInt32], b_start: Int, b_end: Int, ) raises -> Tuple[List[UInt32], List[UInt32]]: @@ -1195,7 +1203,9 @@ def _divmod_knuth_d_from_slices( var m = len_a_eff - n var u = List[UInt32](capacity=len_a_eff + 1) u.resize(unsafe_uninit_length=len_a_eff) - memcpy(dest=u._data, src=a._data + a_start, count=len_a_eff) + unsafe_memcpy( + dest=u._data, src=a._data.unsafe_offset(a_start), count=len_a_eff + ) # Ensure u has an extra leading word if len(u) <= m + n: u.append(UInt32(0)) @@ -1681,9 +1691,7 @@ def multiply(x1: BigInt, x2: BigInt) -> BigInt: # ===----------------------------------------------------------------------=== # -def _compare_magnitudes_words( - read a: List[UInt32], read b: List[UInt32] -) -> Int8: +def _compare_magnitudes_words(imm a: List[UInt32], imm b: List[UInt32]) -> Int8: """Compares the magnitudes of two word lists. Returns: @@ -1699,7 +1707,7 @@ def _compare_magnitudes_words( return 0 -def add_inplace(mut x: BigInt, read other: BigInt): +def add_inplace(mut x: BigInt, imm other: BigInt): """Performs x += other by mutating x.words directly. Avoids allocating a new BigInt. Uses the existing _add_magnitudes_inplace @@ -1815,7 +1823,7 @@ def add_int_inplace(mut x: BigInt, value: Int): x.sign = other_sign -def subtract_inplace(mut x: BigInt, read other: BigInt): +def subtract_inplace(mut x: BigInt, imm other: BigInt): """Performs x -= other by mutating x.words directly. Avoids allocating a new BigInt. Leverages the relationship: @@ -1862,7 +1870,7 @@ def subtract_inplace(mut x: BigInt, read other: BigInt): x.sign = effective_other_sign -def multiply_inplace(mut x: BigInt, read other: BigInt): +def multiply_inplace(mut x: BigInt, imm other: BigInt): """Performs x *= other by computing the product and moving the result into x.words. @@ -2059,7 +2067,7 @@ def right_shift_inplace(mut x: BigInt, shift: Int): x._normalize() -def floor_divide_inplace(mut x: BigInt, read other: BigInt) raises: +def floor_divide_inplace(mut x: BigInt, imm other: BigInt) raises: """Performs x //= other by computing the quotient and moving the result into x.words. @@ -2109,7 +2117,7 @@ def floor_divide_inplace(mut x: BigInt, read other: BigInt) raises: x._normalize() -def floor_modulo_inplace(mut x: BigInt, read other: BigInt) raises: +def floor_modulo_inplace(mut x: BigInt, imm other: BigInt) raises: """Performs x %= other by computing the remainder and moving the result into x.words. diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 318f50f2..68c82922 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -27,7 +27,7 @@ for the Decimo library. It uses base-2^32 representation with UInt32 words in little-endian order, and a separate sign bit. """ -from std.memory import UnsafePointer, memcpy +from std.memory import UnsafePointer, unsafe_memcpy from std.sys import size_of import decimo.bigint.arithmetics as bigint_arithmetics @@ -2153,20 +2153,20 @@ def _from_decimal_digits_simple( # ---- Fast path: ≤ 9 digits → single UInt32 word, no allocation ---- if digit_count <= 9: - var dp = digits._data + start - var val: UInt32 = UInt32(dp[0]) + var dp = digits._data.unsafe_offset(start) + var val: UInt32 = UInt32(dp[]) for j in range(1, digit_count): - val = val * 10 + UInt32(dp[j]) + val = val * 10 + UInt32(dp[unsafe_offset=j]) var result = BigInt() result.words[0] = val return result^ # ---- Fast path: 10–19 digits → parse into UInt64, at most 2 words ---- if digit_count <= 19: - var dp = digits._data + start - var val: UInt64 = UInt64(dp[0]) + var dp = digits._data.unsafe_offset(start) + var val: UInt64 = UInt64(dp[]) for j in range(1, digit_count): - val = val * 10 + UInt64(dp[j]) + val = val * 10 + UInt64(dp[unsafe_offset=j]) var result = BigInt() result.words[0] = UInt32(val & 0xFFFF_FFFF) var high_word = UInt32(val >> 32) @@ -2191,13 +2191,13 @@ def _from_decimal_digits_simple( if first_chunk == 0: first_chunk = 9 - var dp = digits._data + start - var chunk_val: UInt32 = UInt32(dp[0]) + var dp = digits._data.unsafe_offset(start) + var chunk_val: UInt32 = UInt32(dp[]) for j in range(1, first_chunk): - chunk_val = chunk_val * 10 + UInt32(dp[j]) - dp += first_chunk + chunk_val = chunk_val * 10 + UInt32(dp[unsafe_offset=j]) + dp = dp.unsafe_offset(first_chunk) - wp[0] = chunk_val + wp[] = chunk_val var word_count: Int = 1 var remaining = digit_count - first_chunk @@ -2206,20 +2206,20 @@ def _from_decimal_digits_simple( while remaining > 0: # Parse 9 digit values → UInt32 chunk - var cv: UInt32 = UInt32(dp[0]) + var cv: UInt32 = UInt32(dp[]) for j in range(1, 9): - cv = cv * 10 + UInt32(dp[j]) - dp += 9 + cv = cv * 10 + UInt32(dp[unsafe_offset=j]) + dp = dp.unsafe_offset(9) remaining -= 9 # Fused multiply-add: result = result * 10^9 + cv (single O(n) pass) var carry: UInt64 = UInt64(cv) for k in range(word_count): - var product = UInt64(wp[k]) * MUL9 + carry - wp[k] = UInt32(product & 0xFFFF_FFFF) + var product = UInt64(wp[unsafe_offset=k]) * MUL9 + carry + wp[unsafe_offset=k] = UInt32(product & 0xFFFF_FFFF) carry = product >> 32 if carry > 0: - wp[word_count] = UInt32(carry) + wp[unsafe_offset=word_count] = UInt32(carry) word_count += 1 # Trim pre-allocated words to the actual live word count. diff --git a/src/decimo/bigint/bitwise.mojo b/src/decimo/bigint/bitwise.mojo index 776e40c4..b9e7207c 100644 --- a/src/decimo/bigint/bitwise.mojo +++ b/src/decimo/bigint/bitwise.mojo @@ -184,9 +184,7 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: # ===----------------------------------------------------------------------=== # -def _binary_bitwise_op_inplace[ - op: StringLiteral -](mut a: BigInt, read b: BigInt): +def _binary_bitwise_op_inplace[op: StringLiteral](mut a: BigInt, imm b: BigInt): """Performs a word-by-word binary bitwise operation on `a` in-place. Computes the result word list and moves it into a.words, avoiding @@ -424,7 +422,7 @@ def bitwise_not(x: BigInt) -> BigInt: # ===----------------------------------------------------------------------=== # -def bitwise_and_inplace(mut a: BigInt, read b: BigInt): +def bitwise_and_inplace(mut a: BigInt, imm b: BigInt): """Performs `a &= b` in-place using Python-compatible two's complement semantics. Args: @@ -434,7 +432,7 @@ def bitwise_and_inplace(mut a: BigInt, read b: BigInt): _binary_bitwise_op_inplace["and"](a, b) -def bitwise_or_inplace(mut a: BigInt, read b: BigInt): +def bitwise_or_inplace(mut a: BigInt, imm b: BigInt): """Performs `a |= b` in-place using Python-compatible two's complement semantics. Args: @@ -444,7 +442,7 @@ def bitwise_or_inplace(mut a: BigInt, read b: BigInt): _binary_bitwise_op_inplace["or"](a, b) -def bitwise_xor_inplace(mut a: BigInt, read b: BigInt): +def bitwise_xor_inplace(mut a: BigInt, imm b: BigInt): """Performs `a ^= b` in-place using Python-compatible two's complement semantics. Args: diff --git a/src/decimo/biguint/arithmetics.mojo b/src/decimo/biguint/arithmetics.mojo index aaf170db..33e8ef9c 100644 --- a/src/decimo/biguint/arithmetics.mojo +++ b/src/decimo/biguint/arithmetics.mojo @@ -20,7 +20,7 @@ Implements basic arithmetic functions for the BigUInt type. from std.algorithm import vectorize from std import math -from std.memory import memcpy, memset_zero +from std.memory import unsafe_memcpy, memset_zero from decimo.biguint.biguint import BigUInt import decimo.biguint.comparison as biguint_comparison @@ -317,7 +317,7 @@ def add_slices_simd( def vector_add[ simd_width: Int - ](i: Int) {mut result, read x, read y, read bounds_x, read bounds_y}: + ](i: Int) {mut result, imm x, imm y, imm bounds_x, imm bounds_y}: result.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i + bounds_x[0]) @@ -347,7 +347,7 @@ def add_slices_simd( def vector_copy_rest_from_longer[ simd_width: Int ](i: Int) { - mut result, read longer, read n_words_shorter_slice, read longer_start + mut result, imm longer, imm n_words_shorter_slice, imm longer_start }: result.words.unsafe_ptr().store[width=simd_width]( n_words_shorter_slice + i, @@ -397,9 +397,9 @@ def add_inplace(mut x: BigUInt, y: BigUInt) -> None: # Normal cases if len(x.words) < len(y.words): - x.words.resize(new_size=len(y.words), value=UInt32(0)) + x.words.resize(length=len(y.words), fill=UInt32(0)) - def vector_add[simd_width: Int](i: Int) {mut x, read y}: + def vector_add[simd_width: Int](i: Int) {mut x, imm y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -447,9 +447,9 @@ def add_by_slice_inplace( # Normal cases if len(x.words) < n_words_y_slice: - x.words.resize(new_size=n_words_y_slice, value=UInt32(0)) + x.words.resize(length=n_words_y_slice, fill=UInt32(0)) - def vector_add[simd_width: Int](i: Int) {mut x, read y, read bounds_y}: + def vector_add[simd_width: Int](i: Int) {mut x, imm y, imm bounds_y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -656,7 +656,7 @@ def subtract_simd(x: BigUInt, y: BigUInt) raises -> BigUInt: # This will first subtract the words in parallel and then handle the borrows. # Note that there will be potential overflow in the subtraction, # but we will take advantage of that. - def vector_subtract[simd_width: Int](i: Int) {mut result, read x, read y}: + def vector_subtract[simd_width: Int](i: Int) {mut result, imm x, imm y}: result.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -665,7 +665,7 @@ def subtract_simd(x: BigUInt, y: BigUInt) raises -> BigUInt: vectorize[BigUInt.VECTOR_WIDTH](len(y.words), vector_subtract) - def vector_copy_rest[simd_width: Int](i: Int) {mut result, read x, read y}: + def vector_copy_rest[simd_width: Int](i: Int) {mut result, imm x, imm y}: result.words.unsafe_ptr().store[width=simd_width]( len(y.words) + i, x.words.unsafe_ptr().load[width=simd_width](len(y.words) + i), @@ -722,7 +722,7 @@ def subtract_inplace(mut x: BigUInt, y: BigUInt) raises -> None: # Note that len(x.words) >= len(y.words) here # Use SIMD operations to subtract the words in parallel. - def vector_subtract[simd_width: Int](i: Int) {mut x, read y}: + def vector_subtract[simd_width: Int](i: Int) {mut x, imm y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -762,7 +762,7 @@ def subtract_no_check_inplace(mut x: BigUInt, y: BigUInt) -> None: # Underflow checks are skipped here, so we assume x >= y # Note that len(x.words) >= len(y.words) under this assumption - def vector_subtract[simd_width: Int](i: Int) {mut x, read y}: + def vector_subtract[simd_width: Int](i: Int) {mut x, imm y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -951,8 +951,8 @@ def multiply_slices( def multiply_slices_schoolbook( - read x: BigUInt, - read y: BigUInt, + imm x: BigUInt, + imm y: BigUInt, bounds_x: Tuple[Int, Int], bounds_y: Tuple[Int, Int], ) -> BigUInt: @@ -1050,8 +1050,8 @@ def multiply_slices_schoolbook( def multiply_slices_deferred_carry( - read x: BigUInt, - read y: BigUInt, + imm x: BigUInt, + imm y: BigUInt, bounds_x: Tuple[Int, Int], bounds_y: Tuple[Int, Int], ) -> BigUInt: @@ -1113,7 +1113,7 @@ def multiply_slices_deferred_carry( # 64-word operands under `-D ASSERT=none`). # # Memory safety: the three buffers all outlive this loop and are never - # resized inside it. `x` / `y` are borrowed (`read`, owned by the caller), + # resized inside it. `x` / `y` are borrowed (`imm`, owned by the caller), # and `column_sums` is only element-mutated (never appended). `List. # unsafe_ptr()` returns an origin-parameterized `UnsafePointer` tied to the # List's origin, so Mojo's lifetime tracking keeps `column_sums` alive for @@ -1169,8 +1169,8 @@ def multiply_slices_deferred_carry( def multiply_slices_karatsuba( - read x: BigUInt, - read y: BigUInt, + imm x: BigUInt, + imm y: BigUInt, bounds_x: Tuple[Int, Int], bounds_y: Tuple[Int, Int], cutoff_number_of_words: Int, @@ -1350,8 +1350,8 @@ def multiply_slices_karatsuba( def multiply_slices_toom3( - read x: BigUInt, - read y: BigUInt, + imm x: BigUInt, + imm y: BigUInt, bounds_x: Tuple[Int, Int], bounds_y: Tuple[Int, Int], ) -> BigUInt: @@ -1961,7 +1961,11 @@ def multiply_by_power_of_billion(x: BigUInt, n: Int) -> BigUInt: # Fill the first n words with zeros memset_zero(ptr=res.words._data, count=n) # Copy the original words to the end of the new list - memcpy(dest=res.words._data + n, src=x.words._data, count=len(x.words)) + unsafe_memcpy( + dest=res.words._data.unsafe_offset(n), + src=x.words._data, + count=len(x.words), + ) res.remove_leading_empty_words() return res^ @@ -2324,7 +2328,7 @@ def floor_divide_estimate_quotient( var numerator: UInt128 var base_index = index_of_word + len(divisor.words) - 2 - # Ensure we don't read beyond bounds + # Ensure we don't imm beyond bounds if base_index + 2 < len(dividend.words): # We can safely load 3 words: r0, r1, r2 numerator = ( @@ -2699,9 +2703,9 @@ def floor_divide_by_power_of_ten(x: BigUInt, n: Int) -> BigUInt: # Drop the low `word_shift` words via memcpy, then sub-word shift. var keep = len(x.words) - word_shift var result = BigUInt(unsafe_uninit_length=keep) - memcpy( + unsafe_memcpy( dest=result.words._data, - src=x.words._data + word_shift, + src=x.words._data.unsafe_offset(word_shift), count=keep, ) _shift_right_by_decimal_digits_inplace(result, digit_shift) @@ -2752,7 +2756,7 @@ def floor_divide_by_power_of_ten_inplace(mut x: BigUInt, n: Int): if word_shift > 0: # Forward shift is safe: dst index < src index, dst[i] is - # written before src[i+1] is read. + # written before src[i+1] is imm. var keep = len(x.words) - word_shift for i in range(keep): x.words[i] = x.words[i + word_shift] @@ -2835,9 +2839,9 @@ def floor_divide_by_power_of_billion(x: BigUInt, n: Int) -> BigUInt: return BigUInt.zero() else: var result = BigUInt(unsafe_uninit_length=n_words_of_result) - memcpy( + unsafe_memcpy( dest=result.words._data, - src=x.words._data + n, + src=x.words._data.unsafe_offset(n), count=n_words_of_result, ) return result^ @@ -2877,7 +2881,7 @@ def floor_divide_by_power_of_billion_inplace(mut x: BigUInt, n: Int): return # Forward shift is safe: dst index < src index, dst[i] is written - # before src[i+1] is read. + # before src[i+1] is imm. for i in range(keep): x.words[i] = x.words[i + n] x.words.shrink(keep) diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index 1babd5b5..9ac33da4 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -23,7 +23,7 @@ operation dunders, and other dunders that implement traits, as well as mathematical methods that do not implement a trait. """ -from std.memory import UnsafePointer, memcpy, memcmp +from std.memory import UnsafePointer, unsafe_memcpy, memcmp from decimo.bigint10.bigint10 import BigInt10 import decimo.biguint.arithmetics as biguint_arithmetics @@ -37,6 +37,7 @@ from decimo.errors import ( ZeroDivisionError, ) import decimo.str as decimo_str +from decimo.rounding_mode import RoundingMode # Type aliases comptime BUInt = BigUInt @@ -440,9 +441,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): # Now we can safely copy the words result = BigUInt(unsafe_uninit_length=n_words) - memcpy( + unsafe_memcpy( dest=result.words._data, - src=value.words._data + start_index, + src=value.words._data.unsafe_offset(start_index), count=n_words, ) result.remove_leading_empty_words() @@ -1599,28 +1600,6 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): # Other dunders # ===------------------------------------------------------------------=== # - def __merge_with__[other_type: type_of(BigInt10)](self) -> BigInt10: - """Merges this BigUInt with a BigInt10 into a BigInt10. - - Parameters: - other_type: The target type. - - Returns: - A BigInt10 value. - """ - return BigInt10(self) - - def __merge_with__[other_type: type_of(BigDecimal)](self) -> BigDecimal: - """Merges this BigUInt with a BigDecimal into a BigDecimal. - - Parameters: - other_type: The target type. - - Returns: - A BigDecimal value. - """ - return BigDecimal(self) - # ===------------------------------------------------------------------=== # # Mathematical methods that do not implement a trait (not a dunder) # ===------------------------------------------------------------------=== # diff --git a/src/decimo/decimal128/decimal128.mojo b/src/decimo/decimal128/decimal128.mojo index dfb4dfa2..5a196906 100644 --- a/src/decimo/decimal128/decimal128.mojo +++ b/src/decimo/decimal128/decimal128.mojo @@ -23,7 +23,8 @@ operation dunders, and other dunders that implement traits, as well as mathematical methods that do not implement a trait. """ -from std.memory import Span, UnsafePointer +from std.collections import Span +from std.memory import UnsafePointer from std.hashlib.hasher import Hasher import decimo.decimal128.arithmetics as decimal128_arithmetics @@ -2871,7 +2872,7 @@ struct Decimal128( var col = max_label_len + 4 # 4 spaces after longest label - def pad(label: String) {read col} -> String: + def pad(label: String) {imm col} -> String: return label + String(" ") * (col - label.byte_length()) var sep_line = String("-") * (col + 30) diff --git a/src/decimo/decimal128/exponential.mojo b/src/decimo/decimal128/exponential.mojo index c684598b..6a637946 100644 --- a/src/decimo/decimal128/exponential.mojo +++ b/src/decimo/decimal128/exponential.mojo @@ -21,6 +21,7 @@ from std import testing from std import time from decimo.errors import ValueError, OverflowError, ZeroDivisionError +from decimo.decimal128.decimal128 import Decimal128 import decimo.decimal128.constants as decimal128_constants import decimo.decimal128.special as decimal128_special import decimo.decimal128.utility as decimal128_utility diff --git a/src/decimo/decimal128/special.mojo b/src/decimo/decimal128/special.mojo index f2f4b016..31c289b4 100644 --- a/src/decimo/decimal128/special.mojo +++ b/src/decimo/decimal128/special.mojo @@ -20,6 +20,7 @@ """Implements functions for special operations on Decimal128 objects.""" +from decimo.decimal128.decimal128 import Decimal128 from decimo.errors import ValueError, OverflowError diff --git a/src/decimo/str.mojo b/src/decimo/str.mojo index 2a5a2b11..3b8f38fb 100644 --- a/src/decimo/str.mojo +++ b/src/decimo/str.mojo @@ -404,7 +404,7 @@ def parse_numeric_string( def convert_fast[ simd_width: Int - ](i: Int) {mut coef, read value_bytes, read extract_start}: + ](i: Int) {mut coef, imm value_bytes, imm extract_start}: coef.unsafe_ptr().store[width=simd_width]( i, value_bytes.unsafe_ptr().load[width=simd_width]( @@ -427,7 +427,7 @@ def parse_numeric_string( def convert_before[ simd_width: Int - ](i: Int) {mut coef, read value_bytes, read extract_start}: + ](i: Int) {mut coef, imm value_bytes, imm extract_start}: coef.unsafe_ptr().store[width=simd_width]( i, value_bytes.unsafe_ptr().load[width=simd_width]( @@ -445,9 +445,9 @@ def parse_numeric_string( simd_width: Int ](i: Int) { mut coef, - read value_bytes, - read decimal_point_pos, - read before_count, + imm value_bytes, + imm decimal_point_pos, + imm before_count, }: coef.unsafe_ptr().store[width=simd_width]( before_count + i, diff --git a/src/decimo/toml/parser.mojo b/src/decimo/toml/parser.mojo index b568333b..1c887849 100644 --- a/src/decimo/toml/parser.mojo +++ b/src/decimo/toml/parser.mojo @@ -34,7 +34,7 @@ from decimo.errors import ValueError from .tokenizer import Token, TokenType, Tokenizer -struct TOMLValue(Copyable, ImplicitlyCopyable, Movable): +struct TOMLValue(Copyable, ImplicitlyDeletable, Movable): """Represents a value in the TOML document.""" var type: TOMLValueType @@ -47,9 +47,9 @@ struct TOMLValue(Copyable, ImplicitlyCopyable, Movable): """The float content when type is `FLOAT`.""" var bool_value: Bool """The boolean content when type is `BOOLEAN`.""" - var array_values: List[TOMLValue] + var array_values: List[Self] """The array elements when type is `ARRAY`.""" - var table_values: Dict[String, TOMLValue] + var table_values: Dict[String, Self] """The key-value pairs when type is `TABLE`.""" def __init__(out self): @@ -59,8 +59,8 @@ struct TOMLValue(Copyable, ImplicitlyCopyable, Movable): self.int_value = 0 self.float_value = 0.0 self.bool_value = False - self.array_values = List[TOMLValue]() - self.table_values = Dict[String, TOMLValue]() + self.array_values = List[Self]() + self.table_values = Dict[String, Self]() def __init__(out self, string_value: String): """Initialize a string TOML value. @@ -132,6 +132,11 @@ struct TOMLValue(Copyable, ImplicitlyCopyable, Movable): self.array_values = copy.array_values.copy() self.table_values = copy.table_values.copy() + def __del__(deinit self): + """Destructor to clean up resources.""" + self.array_values.clear() + self.table_values.clear() + def is_table(self) -> Bool: """Checks if this value is a table. @@ -383,7 +388,7 @@ struct TOMLDocument(Copyable, Movable): Missing keys are handled gracefully and do not raise. """ if key in self.root: - return self.root[key] + return self.root[key].copy() return TOMLValue() def get_table(self, table_name: String) raises -> Dict[String, TOMLValue]: @@ -441,7 +446,7 @@ struct TOMLDocument(Copyable, Movable): var result = List[Dict[String, TOMLValue]]() if key in self.root: - var value = self.root[key] + var value = self.root[key].copy() if value.type == TOMLValueType.ARRAY: for table_value in value.array_values: if table_value.type == TOMLValueType.TABLE: From c178c3d2fb7d74f6187eeec08e20fe6f708d1918 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Thu, 23 Jul 2026 18:50:47 +0200 Subject: [PATCH 02/10] Update to the latest nightly version --- pixi.lock | 88 +++++++++++++------------- src/cli/calculator/io.mojo | 2 +- src/decimo/bigdecimal/bigdecimal.mojo | 2 +- src/decimo/bigdecimal/exponential.mojo | 2 +- src/decimo/bigint/arithmetics.mojo | 16 ++--- src/decimo/bigint/bigint.mojo | 2 +- src/decimo/bigint10/bigint10.mojo | 2 +- src/decimo/biguint/arithmetics.mojo | 8 +-- src/decimo/biguint/biguint.mojo | 2 +- src/decimo/biguint/exponential.mojo | 4 +- src/decimo/decimal128/decimal128.mojo | 9 +-- 11 files changed, 69 insertions(+), 68 deletions(-) diff --git a/pixi.lock b/pixi.lock index 4f440bd4..2cf4cf98 100644 --- a/pixi.lock +++ b/pixi.lock @@ -60,11 +60,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026071805-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026071805-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda @@ -143,11 +143,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026071805-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026071805-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026071805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda @@ -895,10 +895,10 @@ packages: license_family: MIT size: 69017 timestamp: 1778169663339 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026071805-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda noarch: python - sha256: 16c6f9b9ce4ba4b6578c81ddeda3cb8bc45b4a4685b13af7cd97759ca1884fb4 - md5: 08746e347a297a5fa0dbe962ef113189 + sha256: bd865b7cfd860d58166fd70fa6071a849033b8479b1e2948606f5165f4a83da1 + md5: 5fb41c53a605dea5a6d111688c4d4f8e depends: - python >=3.10 - click >=8.0.0 @@ -908,8 +908,8 @@ packages: - platformdirs >=2 - tomli >=1.1.0 license: LicenseRef-Modular-Proprietary - size: 135951 - timestamp: 1784354031113 + size: 135952 + timestamp: 1784787149546 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -919,53 +919,53 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026071805-release.conda - sha256: a447ea9cb950f63f0f9fa829dce0ee62163c85abfb43090d092f11c997801bfb - md5: d09f79f9cf3b0daab339b5ea3482a438 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda + sha256: f3115e6a84e659352b6bcbf4fa6cfebd32ab8ffdbaa2501f18df60bcdac78dc1 + md5: 131a3517a02482713cf99343f146c7dd depends: - python >=3.10 - - mojo-compiler ==1.0.0b3.dev2026071805 - - mblack ==26.5.0.dev2026071805 + - mojo-compiler ==1.0.0b3.dev2026072306 + - mblack ==26.5.0.dev2026072306 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 114468481 - timestamp: 1784354161905 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026071805-release.conda - sha256: 4bf774f0246278ceb551ea203325511399de7f778a3dab0376aa05f1241c8665 - md5: c1e05f12545f69667a1c2b046d8d6ce4 + size: 114481928 + timestamp: 1784787284605 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda + sha256: 69d7eda6b8b2c591ebf819326bc075879955fa1fb80da8d6eccbd91587026d7a + md5: 41723c21d61e78115129d3f5610c2bb1 depends: - python >=3.10 - - mojo-compiler ==1.0.0b3.dev2026071805 - - mblack ==26.5.0.dev2026071805 + - mojo-compiler ==1.0.0b3.dev2026072306 + - mblack ==26.5.0.dev2026072306 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 100053333 - timestamp: 1784354697042 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026071805-release.conda - sha256: dc583f66a63993c6b3356dc5825bd5756c90ba915acf37a20465c4d37a009e6d - md5: f52d13f5f50da9e6d925ddb284d76f9a + size: 100044215 + timestamp: 1784787408862 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + sha256: 9495999b5a594da5f8da4887f049d399789bb32a89d566cc3f3789b012affee0 + md5: 0617686ea407895e1d0f5a163c9dc9d9 depends: - - mojo-python ==1.0.0b3.dev2026071805 + - mojo-python ==1.0.0b3.dev2026072306 license: LicenseRef-Modular-Proprietary - size: 81673708 - timestamp: 1784354208011 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026071805-release.conda - sha256: 5b6a36621665bcee424a2f1c97bc28273fed59fa9645024214266dd89a3909cb - md5: df9a376c6fe97bdd240d00d7bdd3ae34 + size: 80568439 + timestamp: 1784787288159 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + sha256: 60bf486f8b3db0912c3f10c45967ec308332cf0e98f20ac92a999188d03934c5 + md5: 0462bec5462c0b3af77036b177c92a75 depends: - - mojo-python ==1.0.0b3.dev2026071805 + - mojo-python ==1.0.0b3.dev2026072306 license: LicenseRef-Modular-Proprietary - size: 63146749 - timestamp: 1784354373058 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026071805-release.conda + size: 62030583 + timestamp: 1784787407344 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda noarch: python - sha256: 8f80b9cfda33cf011195dec5ca19a14d74dc57fcc535b8e5f206a9c2cee9e010 - md5: e0075d7c44be89035c68339a092c2b50 + sha256: 31997eb3977ccd43979f8032992a66e48e84e09c00406f85ae581046189b37ad + md5: 40933c74ecddff04ae43165667bcb42b depends: - python >=3.10 license: LicenseRef-Modular-Proprietary - size: 24110 - timestamp: 1784354031288 + size: 24123 + timestamp: 1784787149484 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda sha256: 6725c1c8db9d025db763e1bba1acdcff2eb2ae20a7766a71512ea84081033288 md5: 0e694257dbf916540b749c3ffc808efe diff --git a/src/cli/calculator/io.mojo b/src/cli/calculator/io.mojo index 9b05fac9..00d0f792 100644 --- a/src/cli/calculator/io.mojo +++ b/src/cli/calculator/io.mojo @@ -152,7 +152,7 @@ def split_into_lines(text: String) -> List[String]: var last = String(text[byte=start:text_len]) # Strip trailing \r if present if last.byte_length() > 0 and last[byte=last.byte_length() - 1] == "\r": - last = String(last[byte = 0 : last.byte_length() - 1]) + last.resize(last.byte_length() - 1) if last.byte_length() > 0: lines.append(last) diff --git a/src/decimo/bigdecimal/bigdecimal.mojo b/src/decimo/bigdecimal/bigdecimal.mojo index 981ea938..d324f67f 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -469,7 +469,7 @@ struct BigDecimal( ValueError: If the string does not represent a valid number. """ _tuple = decimo_str.parse_numeric_string(value) - var ref coef: List[UInt8] = _tuple[0] + ref coef: List[UInt8] = _tuple[0] var scale: Int = _tuple[1] var sign: Bool = _tuple[2] diff --git a/src/decimo/bigdecimal/exponential.mojo b/src/decimo/bigdecimal/exponential.mojo index 0431b2bb..016c4817 100644 --- a/src/decimo/bigdecimal/exponential.mojo +++ b/src/decimo/bigdecimal/exponential.mojo @@ -471,7 +471,7 @@ def root(x: BigDecimal, n: BigDecimal, precision: Int) raises -> BigDecimal: return result^ _tuple = is_integer_reciprocal_and_return(n) var is_integer_reciprocal: Bool = _tuple[0] - var ref integer_reciprocal: BigDecimal = _tuple[1] + ref integer_reciprocal: BigDecimal = _tuple[1] if is_integer_reciprocal: # If m = 1/n is an integer, use integer_root var result = integer_power(x, integer_reciprocal, precision) diff --git a/src/decimo/bigint/arithmetics.mojo b/src/decimo/bigint/arithmetics.mojo index e5d3b210..d956da9e 100644 --- a/src/decimo/bigint/arithmetics.mojo +++ b/src/decimo/bigint/arithmetics.mojo @@ -33,7 +33,7 @@ Algorithms: (< CUTOFF_BURNIKEL_ZIEGLER words). Single-word fast path for UInt32 divisors. """ -from std.memory import unsafe_memcpy, memset_zero +from std.memory import unsafe_memcpy, unsafe_memset_zero from decimo.bigint.bigint import BigInt from decimo.bigint.comparison import compare_magnitudes @@ -292,7 +292,7 @@ def _multiply_magnitudes_schoolbook( var result_len = len_a + len_b var result = List[UInt32](capacity=result_len) result.resize(unsafe_uninit_length=result_len) - memset_zero(ptr=result._data, count=result_len) + unsafe_memset_zero(ptr=result._data, count=result_len) for i in range(len_a): var ai = UInt64(a[a_start + i]) @@ -389,7 +389,7 @@ def _multiply_magnitudes_karatsuba( var rlen = len_a + len_b var result = List[UInt32](capacity=rlen) result.resize(unsafe_uninit_length=rlen) - memset_zero(ptr=result._data, count=rlen) + unsafe_memset_zero(ptr=result._data, count=rlen) _add_at_offset_inplace(result, z0, 0) _add_at_offset_inplace(result, z1, m) while rlen > 1 and result[rlen - 1] == 0: @@ -409,7 +409,7 @@ def _multiply_magnitudes_karatsuba( var rlen = len_a + len_b var result = List[UInt32](capacity=rlen) result.resize(unsafe_uninit_length=rlen) - memset_zero(ptr=result._data, count=rlen) + unsafe_memset_zero(ptr=result._data, count=rlen) _add_at_offset_inplace(result, z0, 0) _add_at_offset_inplace(result, z1, m) while rlen > 1 and result[rlen - 1] == 0: @@ -452,7 +452,7 @@ def _multiply_magnitudes_karatsuba( var result_len = len_a + len_b var result = List[UInt32](capacity=result_len) result.resize(unsafe_uninit_length=result_len) - memset_zero(ptr=result._data, count=result_len) + unsafe_memset_zero(ptr=result._data, count=result_len) # Add z0 at offset 0 _add_at_offset_inplace(result, z0, 0) @@ -659,7 +659,7 @@ def _shift_left_words_inplace(mut a: List[UInt32], n: Int): p[unsafe_offset=i + n] = p[unsafe_offset=i] # Fill the first n words with zeros - memset_zero(ptr=a._data, count=n) + unsafe_memset_zero(ptr=a._data, count=n) def _divmod_single_word( @@ -1212,7 +1212,7 @@ def _divmod_knuth_d_from_slices( var quotient = List[UInt32](capacity=m + 1) quotient.resize(unsafe_uninit_length=m + 1) - memset_zero(ptr=quotient._data, count=m + 1) + unsafe_memset_zero(ptr=quotient._data, count=m + 1) # v_n_minus_1 and v_n_minus_2 read directly from b via offset var v_n_minus_1 = UInt64(b[b_start + n - 1]) @@ -1359,7 +1359,7 @@ def _divmod_burnikel_ziegler( var q_total_words = (t - 1) * n var quotient = List[UInt32](capacity=q_total_words + 1) quotient.resize(unsafe_uninit_length=q_total_words) - memset_zero(ptr=quotient._data, count=q_total_words) + unsafe_memset_zero(ptr=quotient._data, count=q_total_words) # First iteration: divide top 2n words by norm_b. var result_pair = _bz_two_by_one_slices( diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 68c82922..1ab1d4cb 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -382,7 +382,7 @@ struct BigInt( + String(e) ), ) - var ref coef: List[UInt8] = _tuple[0] + ref coef: List[UInt8] = _tuple[0] var scale: Int = _tuple[1] var sign: Bool = _tuple[2] diff --git a/src/decimo/bigint10/bigint10.mojo b/src/decimo/bigint10/bigint10.mojo index 3905f425..e3ba0466 100644 --- a/src/decimo/bigint10/bigint10.mojo +++ b/src/decimo/bigint10/bigint10.mojo @@ -374,7 +374,7 @@ struct BigInt10( + String(e) ), ) - var ref coef: List[UInt8] = _tuple[0] + ref coef: List[UInt8] = _tuple[0] var sign: Bool = _tuple[2] # Check if the number is zero diff --git a/src/decimo/biguint/arithmetics.mojo b/src/decimo/biguint/arithmetics.mojo index 33e8ef9c..6a284887 100644 --- a/src/decimo/biguint/arithmetics.mojo +++ b/src/decimo/biguint/arithmetics.mojo @@ -20,7 +20,7 @@ Implements basic arithmetic functions for the BigUInt type. from std.algorithm import vectorize from std import math -from std.memory import unsafe_memcpy, memset_zero +from std.memory import unsafe_memcpy, unsafe_memset_zero from decimo.biguint.biguint import BigUInt import decimo.biguint.comparison as biguint_comparison @@ -1008,7 +1008,7 @@ def multiply_slices_schoolbook( # Allocate the result of zero words with the maximum length # The leading zeros need to be removed before returning the result var result = BigUInt(unsafe_uninit_length=max_result_len) - memset_zero(ptr=result.words._data, count=max_result_len) + unsafe_memset_zero(ptr=result.words._data, count=max_result_len) # Perform the multiplication word by word (from least significant to most significant) # x = x[start_x] + x[start_x + 1] * 10^9 @@ -1628,7 +1628,7 @@ def multiply_slices_toom3( # Maximum result length: nx + ny words (product of two numbers). var result_len = nx + ny var result = BigUInt(unsafe_uninit_length=result_len) - memset_zero(ptr=result.words._data, count=result_len) + unsafe_memset_zero(ptr=result.words._data, count=result_len) # Helper: add a BigUInt value at a word offset into result @parameter @@ -1959,7 +1959,7 @@ def multiply_by_power_of_billion(x: BigUInt, n: Int) -> BigUInt: var res = BigUInt(unsafe_uninit_length=len(x.words) + n) # Fill the first n words with zeros - memset_zero(ptr=res.words._data, count=n) + unsafe_memset_zero(ptr=res.words._data, count=n) # Copy the original words to the end of the new list unsafe_memcpy( dest=res.words._data.unsafe_offset(n), diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index 9ac33da4..3dc7da8a 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -659,7 +659,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): The BigUInt representation of the string. """ _tuple = decimo_str.parse_numeric_string(value) - var ref coef: List[UInt8] = _tuple[0] + ref coef: List[UInt8] = _tuple[0] var scale: Int = _tuple[1] var sign: Bool = _tuple[2] diff --git a/src/decimo/biguint/exponential.mojo b/src/decimo/biguint/exponential.mojo index 90b32fff..42c79d09 100644 --- a/src/decimo/biguint/exponential.mojo +++ b/src/decimo/biguint/exponential.mojo @@ -17,7 +17,7 @@ """Implements exponential functions for the BigUInt type.""" from std import math -from std.memory import memset_zero +from std.memory import unsafe_memset_zero from decimo.biguint.biguint import BigUInt import decimo.biguint.arithmetics as biguint_arithmetics @@ -187,7 +187,7 @@ def sqrt_initial_guess(x: BigUInt) -> BigUInt: nsw = 999_999_999 result = BigUInt(unsafe_uninit_length=n_words + 1) - memset_zero(ptr=result.words._data, count=n_words + 1) + unsafe_memset_zero(ptr=result.words._data, count=n_words + 1) # Boundary checks are not needed here because len(x.words) > 2 result.words.unsafe_set(n_words, msw_sqrt) result.words.unsafe_set( diff --git a/src/decimo/decimal128/decimal128.mojo b/src/decimo/decimal128/decimal128.mojo index 5a196906..b431cb12 100644 --- a/src/decimo/decimal128/decimal128.mojo +++ b/src/decimo/decimal128/decimal128.mojo @@ -1138,7 +1138,7 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - ptr=buf.unsafe_ptr() + pos, length=n_digits + unsafe_ptr=buf.unsafe_ptr() + pos, length=n_digits ) ) ) @@ -1157,7 +1157,7 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - ptr=buf.unsafe_ptr() + frac_start, length=scale + unsafe_ptr=buf.unsafe_ptr() + frac_start, length=scale ) ) ) @@ -1166,7 +1166,7 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - ptr=buf.unsafe_ptr() + pos, length=int_len + unsafe_ptr=buf.unsafe_ptr() + pos, length=int_len ) ) ) @@ -1174,7 +1174,8 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - ptr=buf.unsafe_ptr() + pos + int_len, length=scale + unsafe_ptr=buf.unsafe_ptr() + pos + int_len, + length=scale, ) ) ) From 5f87793acce4dd404187f82811604272b7c343d0 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Fri, 24 Jul 2026 11:11:19 +0200 Subject: [PATCH 03/10] Fix typos --- src/decimo/biguint/arithmetics.mojo | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/decimo/biguint/arithmetics.mojo b/src/decimo/biguint/arithmetics.mojo index 6a284887..6668bd9d 100644 --- a/src/decimo/biguint/arithmetics.mojo +++ b/src/decimo/biguint/arithmetics.mojo @@ -2328,7 +2328,7 @@ def floor_divide_estimate_quotient( var numerator: UInt128 var base_index = index_of_word + len(divisor.words) - 2 - # Ensure we don't imm beyond bounds + # Ensure we don't read beyond bounds if base_index + 2 < len(dividend.words): # We can safely load 3 words: r0, r1, r2 numerator = ( @@ -2756,7 +2756,7 @@ def floor_divide_by_power_of_ten_inplace(mut x: BigUInt, n: Int): if word_shift > 0: # Forward shift is safe: dst index < src index, dst[i] is - # written before src[i+1] is imm. + # written before src[i+1] is read. var keep = len(x.words) - word_shift for i in range(keep): x.words[i] = x.words[i + word_shift] @@ -2881,7 +2881,7 @@ def floor_divide_by_power_of_billion_inplace(mut x: BigUInt, n: Int): return # Forward shift is safe: dst index < src index, dst[i] is written - # before src[i+1] is imm. + # before src[i+1] is read. for i in range(keep): x.words[i] = x.words[i + n] x.words.shrink(keep) From 141be12e3bc9772e7d906ca18d3740e94f07ee3e Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Mon, 27 Jul 2026 19:20:37 +0200 Subject: [PATCH 04/10] Update --- docs/changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index 442aec32..9a3ab469 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,7 +2,9 @@ This is a list of changes for the Decimo package (formerly DeciMojo). -## Unreleased +## Unreleased (v0.12.0) + +Decimo v0.12.0 retargets the codebase to **Mojo v1.0.0**. ### ⭐️ New From c420094e2a304072bc9dfe27009aa2939952273f Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Mon, 10 Aug 2026 11:54:11 +0200 Subject: [PATCH 05/10] Update lock version --- pixi.lock | 2265 +++++++++++++++++++++++++++++------------------------ 1 file changed, 1253 insertions(+), 1012 deletions(-) diff --git a/pixi.lock b/pixi.lock index 2cf4cf98..203e3174 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,4 +1,16 @@ -version: 6 +version: 7 +platforms: +- name: linux-64 + virtual-packages: + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=x86_64 +- name: osx-arm64 + virtual-packages: + - __unix=0=0 + - __osx=13.0 + - __archspec=0=m1 environments: default: channels: @@ -6,32 +18,67 @@ environments: - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - url: https://conda.anaconda.org/conda-forge/ - options: - pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda @@ -42,87 +89,63 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda @@ -132,58 +155,71 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py314h7bede21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -198,45 +234,6 @@ packages: license_family: BSD size: 28948 timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - sha256: 2a7204314663eeda5dec482a956f0e2eaf289bd5b9953eaaaad0e81aa64638f2 - md5: 3845f3d75991bae0fb90884662f4327c - depends: - - cpython - - python-gil - license: MIT - license_family: MIT - size: 8144 - timestamp: 1784221492234 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 - md5: 767d508c1a67e02ae8f50e44cacfadb2 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 7069 - timestamp: 1733218168786 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - sha256: 25abdb37e186f0d6ac3b774a63c81c5bc4bf554b5096b51343fa5e7c381193b1 - md5: bea46844deb274b2cc2a3a941745fa73 - depends: - - python >=3.10 - - backports - - python - license: MIT - license_family: MIT - size: 35739 - timestamp: 1767290467820 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda - noarch: generic - sha256: 709cac7434d1c5a8828105036212a2a36022a07d807e89e2e99cac939c2d2526 - md5: 40d89d8546ad6e139e73ec8f6d56068b - depends: - - python >=3.14 - license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 7526 - timestamp: 1781450817767 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 md5: 8910d2c46f7e7b519129f486e0fe927a @@ -252,21 +249,6 @@ packages: license_family: MIT size: 367376 timestamp: 1764017265553 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 - md5: f9501812fe7c66b6548c7fcaa1c1f252 - depends: - - __osx >=11.0 - - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - constrains: - - libbrotlicommon 1.2.0 hc919400_1 - license: MIT - license_family: MIT - size: 359854 - timestamp: 1764018178608 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -277,31 +259,6 @@ packages: license_family: BSD size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df - md5: 620b85a3f45526a8bc4d23fd78fc22f0 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - size: 124834 - timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf - md5: a9965dd99f683c5f444428f896635716 - depends: - - __unix - license: ISC - size: 128866 - timestamp: 1781708962055 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda - sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f - md5: c13824fedced67005d3832c152fe9c2f - depends: - - python >=3.10 - license: ISC - size: 133877 - timestamp: 1781719949728 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda sha256: 39d0d45c4c73162c0aadd0b1bce6ce42ca354da65979f49d6084ff00ed5c26b4 md5: 26f3b9c52441a170b2008cbc227f740a @@ -316,35 +273,6 @@ packages: license_family: MIT size: 306297 timestamp: 1783424159025 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda - sha256: 8d8813ef655b4e75e4fb897abd83ad548882efad7b4e836b021b797f42780799 - md5: d154b40b109e503430979e8a8d099eaf - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 61418 - timestamp: 1783505332569 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - sha256: ccc4787f511964f9a1f2d2d2859c91c5d571fb60f7f09d4c4e092c9b7a94e671 - md5: 2c4bd6aeb90bb157456841c3270a0d92 - depends: - - __unix - - python - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - size: 107155 - timestamp: 1783085363526 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 27011 - timestamp: 1733218222191 - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda sha256: f80e00a568128566ac97787afcc2701bd3e636799363b9e2c88ce8733361e525 md5: a072db87d32836deeeffd30995529d63 @@ -357,37 +285,16 @@ packages: license_family: BSD size: 1280692 timestamp: 1783844531090 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda - sha256: 07a9e5db549ea212bcd8543595340918e455affb4b4b126e6d3c6ff1fc15d2ae - md5: 7be112e4bbfe38ae52a82d64fb5193b1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + sha256: 1c8128f2ba8fccf627729968de7fe7504dbb775c829e533439c9ee52134800fd + md5: b1dd101231d277ad724c40c788f6fdd8 depends: - - __osx >=11.0 - constrains: - - __osx >=11.0 - license: BSD-2-Clause - license_family: BSD - size: 1208953 - timestamp: 1783844567994 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda - noarch: generic - sha256: 7a548856ef5307890a8cadfc196655117658f8c24589ce175caa4c1c2ded9d13 - md5: b28fe35fd43d5f425c0dccbe5b5039fd - depends: - - python >=3.14,<3.15.0a0 - - python_abi * *_cp314 - license: Python-2.0 - size: 49333 - timestamp: 1781254618863 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda - sha256: 1c8128f2ba8fccf627729968de7fe7504dbb775c829e533439c9ee52134800fd - md5: b1dd101231d277ad724c40c788f6fdd8 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=2.0 - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - __glibc >=2.17,<3.0.a0 + - cffi >=2.0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT @@ -407,195 +314,6 @@ packages: license: AFL-2.1 OR GPL-2.0-or-later size: 447649 timestamp: 1764536047944 -- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - sha256: def3b2566a1702fa083a8984753ac0b3e3f7381048f88714e03d55b7bd930b74 - md5: 2c3958e02221c2504ec036139e648d8b - depends: - - python >=3.10 - - python - license: LGPL-3.0-only - license_family: LGPL - size: 459540 - timestamp: 1779967837277 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 - depends: - - python >=3.10 - - hyperframe >=6.1,<7 - - hpack >=4.1,<5 - - python - license: MIT - license_family: MIT - size: 95967 - timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 - md5: b395909221b9bd1df066e5930e18855b - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 32884 - timestamp: 1782283986153 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 17397 - timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - sha256: 54c80a4ca6e6a19b4bb89c829f757d0de00362a3bfa4647517d2ebd519717f0f - md5: 563a022fc58cf7a200c35cb3fee07a6b - depends: - - python >=3.10 - - urllib3 >=2,<3 - - python - license: Apache-2.0 - license_family: APACHE - size: 27972 - timestamp: 1770237711404 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda - sha256: c75632ea624aa450a394f570749420c5a2e0997d0216bc29d5d45b0f39df0426 - md5: 577b04680ae422adb86fc60d7b940659 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 163869 - timestamp: 1781620148226 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 - md5: ffc17e785d64e12fc311af9184221839 - depends: - - python >=3.10 - - zipp >=3.20 - - python - license: Apache-2.0 - license_family: APACHE - size: 34766 - timestamp: 1779714582554 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a - md5: 0ba6225c279baf7ea9473a62ea0ec9ae - depends: - - python >=3.10 - - zipp >=3.1.0 - constrains: - - importlib-resources >=7.1.0,<7.1.1.0a0 - license: Apache-2.0 - license_family: APACHE - size: 34809 - timestamp: 1776068839274 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 - md5: d59568bad316413c89831456e691de29 - depends: - - python >=3.10 - - more-itertools - - python - license: MIT - license_family: MIT - size: 14831 - timestamp: 1767294269456 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda - sha256: 108b3919db8ef81b5585b38a3fedbe9eeccdf8fa576c250a13559a1188f597cc - md5: b9d2b1ffa307961f6bb7d83c8ba8a8be - depends: - - python >=3.10 - - backports.tarfile - - python - license: MIT - license_family: MIT - size: 16222 - timestamp: 1776862415793 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda - sha256: d23b9e8e8d5968699ec2bc9f8d182598e86e494dbe8a3a71b4a53b1be9a3cb16 - md5: 8665b873062a31a90b563bf493f9fb2c - depends: - - python >=3.10 - - more-itertools - - python - license: MIT - license_family: MIT - size: 18997 - timestamp: 1784015600777 -- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda - sha256: 00d37d85ca856431c67c8f6e890251e7cc9e5ef3724a0302b8d4a101f22aa27f - md5: b4b91eb14fbe2f850dd2c5fc20676c0d - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 40015 - timestamp: 1740828380668 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a - md5: 4ebae00eae9705b0c3d6d1018a81d047 - depends: - - importlib-metadata >=4.8.3 - - jupyter_core >=4.12,!=5.0.* - - python >=3.9 - - python-dateutil >=2.8.2 - - pyzmq >=23.0 - - tornado >=6.2 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 106342 - timestamp: 1733441040958 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a - md5: b38fe4e78ee75def7e599843ef4c1ab0 - depends: - - __unix - - python - - platformdirs >=2.5 - - python >=3.10 - - traitlets >=5.3 - - python - constrains: - - pywin32 >=300 - license: BSD-3-Clause - license_family: BSD - size: 65503 - timestamp: 1760643864586 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - sha256: 9def5c6fb3b3b4952a4f6b55a019b5c7065b592682b84710229de5a0b73f6364 - md5: c88f9579d08eb4031159f03640714ce3 - depends: - - __osx - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - python >=3.10 - license: MIT - license_family: MIT - size: 37924 - timestamp: 1763320995459 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda - sha256: 010718b1b1a35ce72782d38e6d6b9495d8d7d0dbea9a3e42901d030ff2189545 - md5: 9eeb0eaf04fa934808d3e070eebbe630 - depends: - - __linux - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - jeepney >=0.4.2 - - python >=3.10 - - secretstorage >=3.2 - license: MIT - license_family: MIT - size: 37717 - timestamp: 1763320674488 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 md5: b38117a3c920364aff79f870c984b4a3 @@ -620,19 +338,6 @@ packages: license_family: MIT size: 1388990 timestamp: 1781859420533 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda - sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 - md5: 8780f41b013d19219faef9c82260744b - depends: - - __osx >=11.0 - - libcxx >=19 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - size: 1159780 - timestamp: 1781859501654 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda sha256: 27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec md5: 449500f2c089da11c40f5c21312e3e07 @@ -645,15 +350,6 @@ packages: license_family: GPL size: 745303 timestamp: 1784214507189 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef - md5: 89f76a2a21a3ec3ec983b5eb237c4113 - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 569349 - timestamp: 1781670209146 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 md5: c277e0a4d549b03ac1e9d6cbbe3d017b @@ -666,17 +362,6 @@ packages: license_family: BSD size: 134676 timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 - md5: 44083d2d2c2025afca315c7a172eab2b - depends: - - ncurses - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD - size: 107691 - timestamp: 1738479560845 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 md5: b24d3c612f71e7aa74158d92106318b2 @@ -689,20 +374,9 @@ packages: license_family: MIT size: 77856 timestamp: 1781203599810 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f - md5: a915151d5d3c5bf039f5ccc8402a436f - depends: - - __osx >=11.0 - constrains: - - expat 2.8.1.* - license: MIT - license_family: MIT - size: 69362 - timestamp: 1781203631990 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 - md5: a360c33a5abe61c07959e449fa1453eb +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -710,15 +384,6 @@ packages: license_family: MIT size: 58592 timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 - md5: 43c04d9cb46ef176bb2a4c77e324d599 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 40979 - timestamp: 1769456747661 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 md5: 57736f29cc2b0ec0b6c2952d3f101b6a @@ -776,16 +441,6 @@ packages: license: 0BSD size: 113478 timestamp: 1775825492909 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e - md5: b1fd823b5ae54fbec272cea0811bd8a9 - depends: - - __osx >=11.0 - constrains: - - xz 5.8.3.* - license: 0BSD - size: 92472 - timestamp: 1775825802659 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 md5: 2c21e66f50753a083cbe6b80f38268fa @@ -796,15 +451,6 @@ packages: license_family: BSD size: 92400 timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 - md5: 57c4be259f5e0b99a5983799a228ae55 - depends: - - __osx >=11.0 - license: BSD-2-Clause - license_family: BSD - size: 73690 - timestamp: 1769482560514 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda sha256: b677bbf1c339d894757c3dcfbb2f88649e499e4991d70ae09a1466da9a6c92d6 md5: 965e4d531b588b2e42f66fd8e48b056c @@ -814,14 +460,6 @@ packages: license: ISC size: 269272 timestamp: 1779163468406 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda - sha256: 202be45db5726757a8ea1f374f85aacc18c504f5ff15b2558496dff4c8779c48 - md5: 9ed5ab909c449bdcae72322e44875a18 - depends: - - __osx >=11.0 - license: ISC - size: 247352 - timestamp: 1779164136206 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda sha256: 365376f4815e5e80def2b3462a2419708b7c292da0da85278386c2618621fff4 md5: 4aed8e657e9ff156bdbe849b4df44389 @@ -832,15 +470,6 @@ packages: license: blessing size: 962119 timestamp: 1782519076616 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda - sha256: a73a8acd97a6599fd6e561514db9f101ca7fd984cdc0cfd91ba74c8aa9dbe067 - md5: 7184d95871a58b8258a8ea124ed5aabc - depends: - - __osx >=11.0 - - libzlib >=1.3.2,<2.0a0 - license: blessing - size: 924912 - timestamp: 1782519136322 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc md5: 5794b3bdc38177caf969dabd3af08549 @@ -874,117 +503,6 @@ packages: license_family: Other size: 63629 timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 - md5: bc5a5721b6439f2f62a84f2548136082 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 47759 - timestamp: 1774072956767 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f - md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 - depends: - - mdurl >=0.1,<1 - - python >=3.10 - license: MIT - license_family: MIT - size: 69017 - timestamp: 1778169663339 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - noarch: python - sha256: bd865b7cfd860d58166fd70fa6071a849033b8479b1e2948606f5165f4a83da1 - md5: 5fb41c53a605dea5a6d111688c4d4f8e - depends: - - python >=3.10 - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9.0 - - platformdirs >=2 - - tomli >=1.1.0 - license: LicenseRef-Modular-Proprietary - size: 135952 - timestamp: 1784787149546 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 - md5: 592132998493b3ff25fd7479396e8351 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 14465 - timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda - sha256: f3115e6a84e659352b6bcbf4fa6cfebd32ab8ffdbaa2501f18df60bcdac78dc1 - md5: 131a3517a02482713cf99343f146c7dd - depends: - - python >=3.10 - - mojo-compiler ==1.0.0b3.dev2026072306 - - mblack ==26.5.0.dev2026072306 - - jupyter_client >=8.6.2,<8.7 - license: LicenseRef-Modular-Proprietary - size: 114481928 - timestamp: 1784787284605 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda - sha256: 69d7eda6b8b2c591ebf819326bc075879955fa1fb80da8d6eccbd91587026d7a - md5: 41723c21d61e78115129d3f5610c2bb1 - depends: - - python >=3.10 - - mojo-compiler ==1.0.0b3.dev2026072306 - - mblack ==26.5.0.dev2026072306 - - jupyter_client >=8.6.2,<8.7 - license: LicenseRef-Modular-Proprietary - size: 100044215 - timestamp: 1784787408862 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - sha256: 9495999b5a594da5f8da4887f049d399789bb32a89d566cc3f3789b012affee0 - md5: 0617686ea407895e1d0f5a163c9dc9d9 - depends: - - mojo-python ==1.0.0b3.dev2026072306 - license: LicenseRef-Modular-Proprietary - size: 80568439 - timestamp: 1784787288159 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - sha256: 60bf486f8b3db0912c3f10c45967ec308332cf0e98f20ac92a999188d03934c5 - md5: 0462bec5462c0b3af77036b177c92a75 - depends: - - mojo-python ==1.0.0b3.dev2026072306 - license: LicenseRef-Modular-Proprietary - size: 62030583 - timestamp: 1784787407344 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda - noarch: python - sha256: 31997eb3977ccd43979f8032992a66e48e84e09c00406f85ae581046189b37ad - md5: 40933c74ecddff04ae43165667bcb42b - depends: - - python >=3.10 - license: LicenseRef-Modular-Proprietary - size: 24123 - timestamp: 1784787149484 -- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - sha256: 6725c1c8db9d025db763e1bba1acdcff2eb2ae20a7766a71512ea84081033288 - md5: 0e694257dbf916540b749c3ffc808efe - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 71270 - timestamp: 1779478190496 -- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 - md5: e9c622e0d00fa24a6292279af3ab6d06 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 11766 - timestamp: 1745776666688 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 md5: fc21868a1a5aacc937e7a18747acb8a5 @@ -994,14 +512,6 @@ packages: license: X11 AND BSD-3-Clause size: 918956 timestamp: 1777422145199 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d - md5: 343d10ed5b44030a2f67193905aea159 - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - size: 805509 - timestamp: 1777423252320 - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda noarch: python sha256: 9c651938be7eef8a3d10387a555ad07feea9345750ef0eb09cf5ac70c3a827b0 @@ -1018,21 +528,6 @@ packages: license_family: MIT size: 672346 timestamp: 1782129862714 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda - noarch: python - sha256: ce2cbbab1b433212f3f40c5d8d123c8ea24b1e8cb20abf13b5dc7522c9f7db69 - md5: 2360c27e16dbf61e6da6993a858d8d45 - depends: - - python - - __osx >=11.0 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 629436 - timestamp: 1782129869826 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b md5: 79dd2074b5cd5c5c6b2930514a11e22d @@ -1044,35 +539,6 @@ packages: license_family: Apache size: 3159683 timestamp: 1781069855778 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda - sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb - md5: 8187a86242741725bfa74785fe812979 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - size: 3102584 - timestamp: 1781069820667 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 - md5: 4c06a92e74452cfa53623a81592e8934 - depends: - - python >=3.8 - - python - license: Apache-2.0 - license_family: APACHE - size: 91574 - timestamp: 1777103621679 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 - md5: 11adc78451c998c0fd162584abfa3559 - depends: - - python >=3.10 - license: MPL-2.0 - license_family: MOZILLA - size: 56559 - timestamp: 1777271601895 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff md5: 7a3bff861a6583f1889021facefc08b1 @@ -1085,153 +551,47 @@ packages: license_family: BSD size: 1222481 timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d - md5: 2c5ef45db85d34799771629bd5860fd7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + build_number: 100 + sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 + md5: 0b9b2f83b5b600e1ac38becde8d0dd44 depends: - - python >=3.10 - - python + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libuuid >=2.42.1,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 36717183 + timestamp: 1781255094700 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d + md5: 2035f68f96be30dc60a5dfd7452c7941 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - size: 26308 - timestamp: 1779972894916 -- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 - md5: 9c5491066224083c41b6d5635ed7107b - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 55886 - timestamp: 1779293633166 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 - md5: 16c18772b340887160c79a6acc022db0 - depends: - - python >=3.10 - license: BSD-2-Clause - license_family: BSD - size: 893031 - timestamp: 1774796815820 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 - md5: d4582021af437c931d7d77ec39007845 - depends: - - python >=3.9 - - tomli >=1.1.0 - license: MIT - license_family: MIT - size: 15528 - timestamp: 1733710122949 -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 - md5: 461219d1a5bd61342293efa2c0c90eac - depends: - - __unix - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 21085 - timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - build_number: 100 - sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 - md5: 0b9b2f83b5b600e1ac38becde8d0dd44 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.3,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 - - libuuid >=2.42.1,<3.0a0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 36717183 - timestamp: 1781255094700 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda - build_number: 100 - sha256: 984081c9fae3a3944c6f2707bbbbc70e8b961f02cdb7c640d9745e2636235632 - md5: 4841be3d0cf616a860efc6e60af66f8b - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.3,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 14059371 - timestamp: 1781254578985 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - sha256: eb8d5e44fddee9033eb7cfdd5ea584b7594b50e31c7602bef553af0fd4ee9266 - md5: fa587158c0d768127faa1a3b4df01e5d - depends: - - python >=3.10 - - colorama - - importlib-metadata >=4.6 - - packaging >=24.0 - - pyproject_hooks - - tomli >=1.1.0 - - python - constrains: - - build <0 - license: MIT - license_family: MIT - size: 28946 - timestamp: 1778048948266 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 - md5: 5b8d21249ff20967101ffa321cab24e8 - depends: - - python >=3.9 - - six >=1.5 - - python - license: Apache-2.0 - license_family: APACHE - size: 233310 - timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda - sha256: 84c129bdd6abcecac42a948f2670d17fe735d02d3a5a483a9b1f1bc33ba38c28 - md5: 224f69f177eb5aae6c9a6052846bf609 - depends: - - cpython 3.14.6.* - - python_abi * *_cp314 - license: Python-2.0 - size: 49315 - timestamp: 1781254664376 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - build_number: 8 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 - md5: 0539938c55b6b1a59b560e843ad864a4 - constrains: - - python 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 6989 - timestamp: 1752805904792 + run_exports: {} + size: 202391 + timestamp: 1770223462836 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda noarch: python sha256: 970b2a1d12983d8d1cc05d914ad88a0b6ef1fa14038c9649aa834dd6ebee65d7 @@ -1248,21 +608,6 @@ packages: license_family: BSD size: 210896 timestamp: 1779483879367 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda - noarch: python - sha256: 086cc67ec57afb7c9c09b5e09e7356b536b5b1af6c2e97117dc022cd22f0d472 - md5: 73f22bde4991f30ae2bfac3811577c15 - depends: - - python - - libcxx >=19 - - __osx >=11.0 - - zeromq >=4.3.5,<4.4.0a0 - - _python_abi3_support 1.* - - cpython >=3.12 - license: BSD-3-Clause - license_family: BSD - size: 191432 - timestamp: 1779484184540 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -1274,78 +619,6 @@ packages: license_family: GPL size: 345073 timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 - md5: f8381319127120ce51e081dce4865cf4 - depends: - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 313930 - timestamp: 1765813902568 -- conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda - sha256: 352b0c6b8c9d25cb16518420e45eae8a3be6718c924c747032a5c6578851b4c9 - md5: be7d616ec4d4e8eec1e4b3f3fe144af4 - depends: - - nh3 >=0.2.14 - - comrak >=0.0.11 - - docutils >=0.21.2 - - pygments >=2.5.1 - - python >=3.10 - - python - license: Apache-2.0 - license_family: APACHE - size: 22324 - timestamp: 1781105511621 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da - md5: 4a85203c1d80c1059086ae860836ffb9 - depends: - - python >=3.10 - - certifi >=2023.5.7 - - charset-normalizer >=2,<4 - - idna >=2.5,<4 - - urllib3 >=1.26,<3 - - python - constrains: - - chardet >=3.0.2,<8 - license: Apache-2.0 - license_family: APACHE - size: 68709 - timestamp: 1778851103479 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 - md5: 66de8645e324fda0ea6ef28c2f99a2ab - depends: - - python >=3.9 - - requests >=2.0.1,<3.0.0 - license: Apache-2.0 - license_family: APACHE - size: 44285 - timestamp: 1733734886897 -- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 - md5: 43e14f832d7551e5a8910672bfc3d8c6 - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 38028 - timestamp: 1733921806657 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a - md5: 0242025a3c804966bf71aa04eee82f66 - depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.10 - - typing_extensions >=4.0.0,<5.0.0 - - python - license: MIT - license_family: MIT - size: 208577 - timestamp: 1775991661559 - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda noarch: python sha256: 2002c7869a95ed94b03303a033fcc24b608597bdd01c8f01d90c47175616edb9 @@ -1359,18 +632,6 @@ packages: license: MIT size: 9333318 timestamp: 1784237314764 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda - noarch: python - sha256: 56362f7c5150de1f01450fcb668dbd9c3f163e9f0f69f1f7c9da5bebd0d75172 - md5: 81fe5e5807d471fcd624bfb6bdb98968 - depends: - - python - - __osx >=11.0 - constrains: - - __osx >=11.0 - license: MIT - size: 8651168 - timestamp: 1784237480462 - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda sha256: 1493aadd9fcb4894b879ea0e0e0eed4cb60a60a26bb95b821dcb6ea5def47d06 md5: 2d7b5ae8ad713d8a7097a75a248f8ba3 @@ -1384,16 +645,6 @@ packages: license_family: BSD size: 34939 timestamp: 1780858492554 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d - md5: 3339e3b65d58accf4ca4fb8748ab16b3 - depends: - - python >=3.9 - - python - license: MIT - license_family: MIT - size: 18455 - timestamp: 1753199211006 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda build_number: 103 sha256: 43624eab22f5f29df7d6ffe914cf442f28fd559b55b290906255492826e636e8 @@ -1407,15 +658,668 @@ packages: license: TCL size: 3550916 timestamp: 1784229071544 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda - sha256: 47186bc7ab8d7e8bee86bbd1a917196f8c21cf63f081fc33cd6d1221af087580 - md5: 8e3cf0e455e6b54519f0b1c72c61780a +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + sha256: bbb7056f7c5fd606df16ed73ee68687050de2c02fd69a3f69a1cb533a7ed2ae8 + md5: 4a8e5889712641aabdf6695e292857fe depends: - - __osx >=11.0 - - libzlib >=1.3.2,<2.0a0 - license: TCL - size: 3338712 - timestamp: 1784229090530 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + size: 918368 + timestamp: 1781006801436 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda + sha256: c84034056dc938c853e4f61e72e5bd37e2ec91927a661fb9762f678cbea52d43 + md5: 5d3c008e54c7f49592fca9c32896a76f + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=14 + - libstdcxx >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 15004 + timestamp: 1769438727085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + sha256: dc9f28dedcb5f35a127fad2d847674d2833369dd616d294e423b8997df31d8a8 + md5: 96b08867e21d4694fa5c2c226e6581b0 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 311184 + timestamp: 1779123989774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 601375 + timestamp: 1764777111296 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + sha256: 2a7204314663eeda5dec482a956f0e2eaf289bd5b9953eaaaad0e81aa64638f2 + md5: 3845f3d75991bae0fb90884662f4327c + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + size: 8144 + timestamp: 1784221492234 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 + md5: 767d508c1a67e02ae8f50e44cacfadb2 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 7069 + timestamp: 1733218168786 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda + sha256: 25abdb37e186f0d6ac3b774a63c81c5bc4bf554b5096b51343fa5e7c381193b1 + md5: bea46844deb274b2cc2a3a941745fa73 + depends: + - python >=3.10 + - backports + - python + license: MIT + license_family: MIT + size: 35739 + timestamp: 1767290467820 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + noarch: generic + sha256: 709cac7434d1c5a8828105036212a2a36022a07d807e89e2e99cac939c2d2526 + md5: 40d89d8546ad6e139e73ec8f6d56068b + depends: + - python >=3.14 + license: BSD-3-Clause AND MIT AND EPL-2.0 + size: 7526 + timestamp: 1781450817767 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf + md5: a9965dd99f683c5f444428f896635716 + depends: + - __unix + license: ISC + size: 128866 + timestamp: 1781708962055 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f + md5: c13824fedced67005d3832c152fe9c2f + depends: + - python >=3.10 + license: ISC + size: 133877 + timestamp: 1781719949728 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 + md5: 381bd45fb7aa032691f3063aff47e3a1 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 13589 + timestamp: 1763607964133 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + sha256: 8d8813ef655b4e75e4fb897abd83ad548882efad7b4e836b021b797f42780799 + md5: d154b40b109e503430979e8a8d099eaf + depends: + - python >=3.10 + license: MIT + license_family: MIT + size: 61418 + timestamp: 1783505332569 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + sha256: ccc4787f511964f9a1f2d2d2859c91c5d571fb60f7f09d4c4e092c9b7a94e671 + md5: 2c4bd6aeb90bb157456841c3270a0d92 + depends: + - __unix + - python + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + size: 107155 + timestamp: 1783085363526 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + noarch: generic + sha256: 7a548856ef5307890a8cadfc196655117658f8c24589ce175caa4c1c2ded9d13 + md5: b28fe35fd43d5f425c0dccbe5b5039fd + depends: + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 + license: Python-2.0 + size: 49333 + timestamp: 1781254618863 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + sha256: e2753997b8bd34205f42be01b8bab8037423dc30c02a1ec12de23e5b4c0b0a2e + md5: 58638f77697c4f6726753eb8be34818b + depends: + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 303705 + timestamp: 1781320269259 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda + sha256: def3b2566a1702fa083a8984753ac0b3e3f7381048f88714e03d55b7bd930b74 + md5: 2c3958e02221c2504ec036139e648d8b + depends: + - python >=3.10 + - python + license: LGPL-3.0-only + license_family: LGPL + size: 459540 + timestamp: 1779967837277 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda + sha256: 5476fe77cc2f59389dd348135462892dc20f42114301221648df90a6e9650186 + md5: 977e2b00d5329b6d56ebe94ae1f4b67c + depends: + - python >=3.10 + license: Unlicense + run_exports: {} + size: 77939 + timestamp: 1785376409053 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python + license: MIT + license_family: MIT + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 + md5: b395909221b9bd1df066e5930e18855b + depends: + - python >=3.10 + license: MIT + license_family: MIT + size: 32884 + timestamp: 1782283986153 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda + sha256: 54c80a4ca6e6a19b4bb89c829f757d0de00362a3bfa4647517d2ebd519717f0f + md5: 563a022fc58cf7a200c35cb3fee07a6b + depends: + - python >=3.10 + - urllib3 >=2,<3 + - python + license: Apache-2.0 + license_family: APACHE + size: 27972 + timestamp: 1770237711404 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 + md5: 84a3233b709a289a4ddd7a2fd27dd988 + depends: + - python >=3.10 + - ukkonen + license: MIT + license_family: MIT + run_exports: {} + size: 79757 + timestamp: 1776455344188 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + sha256: c75632ea624aa450a394f570749420c5a2e0997d0216bc29d5d45b0f39df0426 + md5: 577b04680ae422adb86fc60d7b940659 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + size: 163869 + timestamp: 1781620148226 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda + sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 + md5: ffc17e785d64e12fc311af9184221839 + depends: + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + size: 34766 + timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a + md5: 0ba6225c279baf7ea9473a62ea0ec9ae + depends: + - python >=3.10 + - zipp >=3.1.0 + constrains: + - importlib-resources >=7.1.0,<7.1.1.0a0 + license: Apache-2.0 + license_family: APACHE + size: 34809 + timestamp: 1776068839274 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda + sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 + md5: d59568bad316413c89831456e691de29 + depends: + - python >=3.10 + - more-itertools + - python + license: MIT + license_family: MIT + size: 14831 + timestamp: 1767294269456 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda + sha256: 108b3919db8ef81b5585b38a3fedbe9eeccdf8fa576c250a13559a1188f597cc + md5: b9d2b1ffa307961f6bb7d83c8ba8a8be + depends: + - python >=3.10 + - backports.tarfile + - python + license: MIT + license_family: MIT + size: 16222 + timestamp: 1776862415793 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda + sha256: d23b9e8e8d5968699ec2bc9f8d182598e86e494dbe8a3a71b4a53b1be9a3cb16 + md5: 8665b873062a31a90b563bf493f9fb2c + depends: + - python >=3.10 + - more-itertools + - python + license: MIT + license_family: MIT + size: 18997 + timestamp: 1784015600777 +- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + sha256: 00d37d85ca856431c67c8f6e890251e7cc9e5ef3724a0302b8d4a101f22aa27f + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 40015 + timestamp: 1740828380668 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a + md5: b38fe4e78ee75def7e599843ef4c1ab0 + depends: + - __unix + - python + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + size: 65503 + timestamp: 1760643864586 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda + sha256: 9def5c6fb3b3b4952a4f6b55a019b5c7065b592682b84710229de5a0b73f6364 + md5: c88f9579d08eb4031159f03640714ce3 + depends: + - __osx + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - python >=3.10 + license: MIT + license_family: MIT + size: 37924 + timestamp: 1763320995459 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda + sha256: 010718b1b1a35ce72782d38e6d6b9495d8d7d0dbea9a3e42901d030ff2189545 + md5: 9eeb0eaf04fa934808d3e070eebbe630 + depends: + - __linux + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - jeepney >=0.4.2 + - python >=3.10 + - secretstorage >=3.2 + license: MIT + license_family: MIT + size: 37717 + timestamp: 1763320674488 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f + md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 + depends: + - mdurl >=0.1,<1 + - python >=3.10 + license: MIT + license_family: MIT + size: 69017 + timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda + sha256: 6725c1c8db9d025db763e1bba1acdcff2eb2ae20a7766a71512ea84081033288 + md5: 0e694257dbf916540b749c3ffc808efe + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 71270 + timestamp: 1779478190496 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11766 + timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee + md5: eb52d14a901e23c39e9e7b4a1a5c015f + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 40866 + timestamp: 1766261270149 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 + md5: 4c06a92e74452cfa53623a81592e8934 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + size: 91574 + timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 + md5: 11adc78451c998c0fd162584abfa3559 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + size: 56559 + timestamp: 1777271601895 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d + md5: 2c5ef45db85d34799771629bd5860fd7 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 26308 + timestamp: 1779972894916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda + sha256: d1d528a9933378ea3734f3ecac83ed4989dc5cba6c0427b237cf35228873a259 + md5: 5f7aee6aa51642db4b57a7a11611dda1 + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.10 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + run_exports: {} + size: 202254 + timestamp: 1784706397465 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 + md5: 9c5491066224083c41b6d5635ed7107b + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 55886 + timestamp: 1779293633166 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 16c18772b340887160c79a6acc022db0 + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + size: 893031 + timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 + md5: d4582021af437c931d7d77ec39007845 + depends: + - python >=3.9 + - tomli >=1.1.0 + license: MIT + license_family: MIT + size: 15528 + timestamp: 1733710122949 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda + sha256: eb8d5e44fddee9033eb7cfdd5ea584b7594b50e31c7602bef553af0fd4ee9266 + md5: fa587158c0d768127faa1a3b4df01e5d + depends: + - python >=3.10 + - colorama + - importlib-metadata >=4.6 + - packaging >=24.0 + - pyproject_hooks + - tomli >=1.1.0 + - python + constrains: + - build <0 + license: MIT + license_family: MIT + size: 28946 + timestamp: 1778048948266 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda + sha256: df1023b39a323a753963f5f50028f0ded0385f37752a800105451463e64f597c + md5: 5fd6bf90409294513b84439f6c184ff2 + depends: + - python >=3.10 + - filelock >=3.15.4 + - platformdirs <5,>=4.3.6 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 37229 + timestamp: 1785577890125 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + sha256: 84c129bdd6abcecac42a948f2670d17fe735d02d3a5a483a9b1f1bc33ba38c28 + md5: 224f69f177eb5aae6c9a6052846bf609 + depends: + - cpython 3.14.6.* + - python_abi * *_cp314 + license: Python-2.0 + size: 49315 + timestamp: 1781254664376 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda + sha256: 352b0c6b8c9d25cb16518420e45eae8a3be6718c924c747032a5c6578851b4c9 + md5: be7d616ec4d4e8eec1e4b3f3fe144af4 + depends: + - nh3 >=0.2.14 + - comrak >=0.0.11 + - docutils >=0.21.2 + - pygments >=2.5.1 + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + size: 22324 + timestamp: 1781105511621 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 + depends: + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python + constrains: + - chardet >=3.0.2,<8 + license: Apache-2.0 + license_family: APACHE + size: 68709 + timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 + md5: 66de8645e324fda0ea6ef28c2f99a2ab + depends: + - python >=3.9 + - requests >=2.0.1,<3.0.0 + license: Apache-2.0 + license_family: APACHE + size: 44285 + timestamp: 1733734886897 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + md5: 43e14f832d7551e5a8910672bfc3d8c6 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 38028 + timestamp: 1733921806657 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a + md5: 0242025a3c804966bf71aa04eee82f66 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda + sha256: 9e200ee5f9ff19a4d94e4b51c4856d53dec849f91032f345cf0c6bc3d51a7183 + md5: 62ac906f1cd582c6c264c95625cb9d6f + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 524488 + timestamp: 1786282924579 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + size: 18455 + timestamp: 1753199211006 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd md5: b5325cf06a000c5b14970462ff5e4d58 @@ -1424,104 +1328,399 @@ packages: - python license: MIT license_family: MIT - size: 21561 - timestamp: 1774492402955 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda - sha256: bbb7056f7c5fd606df16ed73ee68687050de2c02fd69a3f69a1cb533a7ed2ae8 - md5: 4a8e5889712641aabdf6695e292857fe + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431 + md5: 37e3be7b6e2977d37b8fa5da229f5dc0 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + size: 115158 + timestamp: 1780507822178 +- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + md5: 901a86453fa6183e914b937643619a03 + depends: + - id + - importlib-metadata >=3.6 + - keyring >=21.2.0 + - packaging >=24.0 + - python >=3.10 + - readme_renderer >=35.0 + - requests >=2.20 + - requests-toolbelt >=0.8.0,!=0.9.0 + - rfc3986 >=1.4.0 + - rich >=12.0.0 + - urllib3 >=1.26.0 + - python + license: Apache-2.0 + license_family: APACHE + size: 42488 + timestamp: 1757013705407 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 + md5: c70ad746c22219b9700931707482992c + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + size: 52631 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 + md5: fcb489df604d100968b737f2cb6076c6 + license: LicenseRef-Public-Domain + size: 118849 + timestamp: 1784250406640 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: cbb88288f74dbe6ada1c6c7d0a97223e + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda + sha256: 33fd59a523f014938b570b773bcd0e10c3d005d25bcaa7e3038eeb57f83a8ae3 + md5: f493af83e599a1b8b103afaf99c38dd6 + depends: + - python >=3.10 + - distlib >=0.3.7,<1 + - filelock <4,>=3.24.2 + - importlib-metadata >=6.6 + - platformdirs >=3.9.1,<5 + - python-discovery >=1.4.2 + - typing_extensions >=4.13.2 + - python + license: MIT + run_exports: {} + size: 3744220 + timestamp: 1786221803596 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 24190 + timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 + md5: f9501812fe7c66b6548c7fcaa1c1f252 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + size: 359854 + timestamp: 1764018178608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py314h7bede21_0.conda + sha256: b6c9358ee7cabfb417e6a8d2758c2241fe6b24f9fd316561a449ccac1959f8e1 + md5: 4648b9514e3cd095788963779cebcc7a + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - pycparser + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 297593 + timestamp: 1785811327918 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda + sha256: 07a9e5db549ea212bcd8543595340918e455affb4b4b126e6d3c6ff1fc15d2ae + md5: 7be112e4bbfe38ae52a82d64fb5193b1 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 1208953 + timestamp: 1783844567994 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 + md5: 8780f41b013d19219faef9c82260744b + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + size: 1159780 + timestamp: 1781859501654 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef + md5: 89f76a2a21a3ec3ec983b5eb237c4113 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 569349 + timestamp: 1781670209146 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f + md5: a915151d5d3c5bf039f5ccc8402a436f + depends: + - __osx >=11.0 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + size: 69362 + timestamp: 1781203631990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 73690 + timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + sha256: 202be45db5726757a8ea1f374f85aacc18c504f5ff15b2558496dff4c8779c48 + md5: 9ed5ab909c449bdcae72322e44875a18 + depends: + - __osx >=11.0 + license: ISC + size: 247352 + timestamp: 1779164136206 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda + sha256: a73a8acd97a6599fd6e561514db9f101ca7fd984cdc0cfd91ba74c8aa9dbe067 + md5: 7184d95871a58b8258a8ea124ed5aabc + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: blessing + size: 924912 + timestamp: 1782519136322 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda + noarch: python + sha256: ce2cbbab1b433212f3f40c5d8d123c8ea24b1e8cb20abf13b5dc7522c9f7db69 + md5: 2360c27e16dbf61e6da6993a858d8d45 + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 629436 + timestamp: 1782129869826 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb + md5: 8187a86242741725bfa74785fe812979 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - __osx >=11.0 + - ca-certificates license: Apache-2.0 license_family: Apache - size: 918368 - timestamp: 1781006801436 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda - sha256: 1a4f3d940cf239acde2fc61674b7cf80219a7f22a369e92b95b245be2d47caf1 - md5: cc1d84777343f00f01c08a2d9550f639 + size: 3102584 + timestamp: 1781069820667 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + build_number: 100 + sha256: 984081c9fae3a3944c6f2707bbbbc70e8b961f02cdb7c640d9745e2636235632 + md5: 4841be3d0cf616a860efc6e60af66f8b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 14059371 + timestamp: 1781254578985 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda + sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 + md5: dcf51e564317816cb8d546891019b3ab depends: - __osx >=11.0 - python >=3.14,<3.15.0a0 - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 915857 - timestamp: 1781007345425 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431 - md5: 37e3be7b6e2977d37b8fa5da229f5dc0 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 189475 + timestamp: 1770223788648 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda + noarch: python + sha256: 086cc67ec57afb7c9c09b5e09e7356b536b5b1af6c2e97117dc022cd22f0d472 + md5: 73f22bde4991f30ae2bfac3811577c15 depends: - - python >=3.10 - python + - libcxx >=19 + - __osx >=11.0 + - zeromq >=4.3.5,<4.4.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 license: BSD-3-Clause license_family: BSD - size: 115158 - timestamp: 1780507822178 -- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb - md5: 901a86453fa6183e914b937643619a03 + size: 191432 + timestamp: 1779484184540 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 depends: - - id - - importlib-metadata >=3.6 - - keyring >=21.2.0 - - packaging >=24.0 - - python >=3.10 - - readme_renderer >=35.0 - - requests >=2.20 - - requests-toolbelt >=0.8.0,!=0.9.0 - - rfc3986 >=1.4.0 - - rich >=12.0.0 - - urllib3 >=1.26.0 - - python - license: Apache-2.0 - license_family: APACHE - size: 42488 - timestamp: 1757013705407 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 - md5: c70ad746c22219b9700931707482992c + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda + noarch: python + sha256: 56362f7c5150de1f01450fcb668dbd9c3f163e9f0f69f1f7c9da5bebd0d75172 + md5: 81fe5e5807d471fcd624bfb6bdb98968 depends: - - python >=3.10 - python - license: PSF-2.0 - license_family: PSF - size: 52631 - timestamp: 1783002732887 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 - md5: fcb489df604d100968b737f2cb6076c6 - license: LicenseRef-Public-Domain - size: 118849 - timestamp: 1784250406640 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 - md5: cbb88288f74dbe6ada1c6c7d0a97223e + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + size: 8651168 + timestamp: 1784237480462 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + sha256: 47186bc7ab8d7e8bee86bbd1a917196f8c21cf63f081fc33cd6d1221af087580 + md5: 8e3cf0e455e6b54519f0b1c72c61780a depends: - - backports.zstd >=1.0.0 - - brotli-python >=1.2.0 - - h2 >=4,<5 - - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.10 + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: TCL + size: 3338712 + timestamp: 1784229090530 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda + sha256: 1a4f3d940cf239acde2fc61674b7cf80219a7f22a369e92b95b245be2d47caf1 + md5: cc1d84777343f00f01c08a2d9550f639 + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + size: 915857 + timestamp: 1781007345425 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda + sha256: 033dbf9859fe58fb85350cf6395be6b1346792e1766d2d5acab538a6eb3659fb + md5: e229f444fbdb28d8c4f40e247154d993 + depends: + - __osx >=11.0 + - cffi + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 103560 - timestamp: 1778188657149 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda - sha256: dc9f28dedcb5f35a127fad2d847674d2833369dd616d294e423b8997df31d8a8 - md5: 96b08867e21d4694fa5c2c226e6581b0 + run_exports: {} + size: 14884 + timestamp: 1769439056290 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - krb5 >=1.22.2,<1.23.0a0 - - libsodium >=1.0.22,<1.0.23.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 311184 - timestamp: 1779123989774 + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 83386 + timestamp: 1753484079473 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda sha256: 01fd50d2801b23b59fafea6bf704a6c5faf0f5969104400eae0e6572cb2e5304 md5: d31c0e54c4f9c51100ec8c812ee925d1 @@ -1534,26 +1733,6 @@ packages: license_family: MOZILLA size: 245404 timestamp: 1779124076307 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 - md5: ba3dcdc8584155c97c648ae9c044b7a3 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 24190 - timestamp: 1779159948016 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 601375 - timestamp: 1764777111296 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 md5: ab136e4c34e97f34fb621d2592a393d8 @@ -1564,3 +1743,65 @@ packages: license_family: BSD size: 433413 timestamp: 1764777166076 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda + sha256: f3115e6a84e659352b6bcbf4fa6cfebd32ab8ffdbaa2501f18df60bcdac78dc1 + md5: 131a3517a02482713cf99343f146c7dd + depends: + - python >=3.10 + - mojo-compiler ==1.0.0b3.dev2026072306 + - mblack ==26.5.0.dev2026072306 + - jupyter_client >=8.6.2,<8.7 + license: LicenseRef-Modular-Proprietary + size: 114481928 + timestamp: 1784787284605 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + sha256: 9495999b5a594da5f8da4887f049d399789bb32a89d566cc3f3789b012affee0 + md5: 0617686ea407895e1d0f5a163c9dc9d9 + depends: + - mojo-python ==1.0.0b3.dev2026072306 + license: LicenseRef-Modular-Proprietary + size: 80568439 + timestamp: 1784787288159 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda + noarch: python + sha256: bd865b7cfd860d58166fd70fa6071a849033b8479b1e2948606f5165f4a83da1 + md5: 5fb41c53a605dea5a6d111688c4d4f8e + depends: + - python >=3.10 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - tomli >=1.1.0 + license: LicenseRef-Modular-Proprietary + size: 135952 + timestamp: 1784787149546 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda + noarch: python + sha256: 31997eb3977ccd43979f8032992a66e48e84e09c00406f85ae581046189b37ad + md5: 40933c74ecddff04ae43165667bcb42b + depends: + - python >=3.10 + license: LicenseRef-Modular-Proprietary + size: 24123 + timestamp: 1784787149484 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda + sha256: 69d7eda6b8b2c591ebf819326bc075879955fa1fb80da8d6eccbd91587026d7a + md5: 41723c21d61e78115129d3f5610c2bb1 + depends: + - python >=3.10 + - mojo-compiler ==1.0.0b3.dev2026072306 + - mblack ==26.5.0.dev2026072306 + - jupyter_client >=8.6.2,<8.7 + license: LicenseRef-Modular-Proprietary + size: 100044215 + timestamp: 1784787408862 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + sha256: 60bf486f8b3db0912c3f10c45967ec308332cf0e98f20ac92a999188d03934c5 + md5: 0462bec5462c0b3af77036b177c92a75 + depends: + - mojo-python ==1.0.0b3.dev2026072306 + license: LicenseRef-Modular-Proprietary + size: 62030583 + timestamp: 1784787407344 From 5acd5e781c4d32cf3cddde74552986bb6799e9b9 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Mon, 10 Aug 2026 19:17:51 +0200 Subject: [PATCH 06/10] Update to latest nightly + Use global_constant to avoid materialization of comptime arrays --- pixi.lock | 94 +- pixi.toml | 6 +- python/decimo_module.mojo | 2 +- src/cli/calculator/io.mojo | 8 +- src/cli/limo/line_editor.mojo | 6 +- src/cli/limo/terminal.mojo | 4 +- src/decimo/bigdecimal/bigdecimal.mojo | 48 +- src/decimo/bigdecimal/exponential.mojo | 6 +- src/decimo/bigdecimal/trigonometric.mojo | 17 +- src/decimo/bigfloat/bigfloat.mojo | 26 +- src/decimo/bigfloat/mpfr_wrapper.mojo | 10 +- src/decimo/bigint/bigint.mojo | 17 +- src/decimo/bigint10/bigint10.mojo | 5 +- src/decimo/biguint/arithmetics.mojo | 155 ++-- src/decimo/biguint/biguint.mojo | 72 +- src/decimo/biguint/exponential.mojo | 8 +- src/decimo/decimal128/decimal128.mojo | 41 +- src/decimo/decimal128/utility.mojo | 841 ++++++------------ src/decimo/expression/tokenizer.mojo | 22 +- src/decimo/numerals/chinese.mojo | 63 +- src/decimo/rational/rational.mojo | 2 +- src/decimo/str.mojo | 18 +- src/decimo/tests.mojo | 32 +- src/decimo/toml/parser.mojo | 5 +- src/decimo/toml/tokenizer.mojo | 40 +- .../test_bigdecimal_arithmetics.mojo | 2 +- .../test_bigdecimal_exponential.mojo | 2 +- .../bigdecimal/test_bigdecimal_rounding.mojo | 2 +- .../test_bigdecimal_trigonometric.mojo | 2 +- tests/bigint10/test_bigint10_arithmetics.mojo | 8 +- tests/biguint/test_biguint_arithmetics.mojo | 6 +- tests/biguint/test_biguint_exponential.mojo | 4 +- tests/numerals/test_chinese.mojo | 4 +- tests/toml/test_decimo_toml.mojo | 4 +- 34 files changed, 681 insertions(+), 901 deletions(-) diff --git a/pixi.lock b/pixi.lock index 203e3174..d8dbc9c9 100644 --- a/pixi.lock +++ b/pixi.lock @@ -122,10 +122,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.1.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.1.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.6.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.1.0.dev2026081005-release.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda @@ -216,10 +216,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.6.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.1.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.1.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.1.0.dev2026081005-release.conda packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -1743,29 +1743,31 @@ packages: license_family: BSD size: 433413 timestamp: 1764777166076 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.0.0b3.dev2026072306-release.conda - sha256: f3115e6a84e659352b6bcbf4fa6cfebd32ab8ffdbaa2501f18df60bcdac78dc1 - md5: 131a3517a02482713cf99343f146c7dd +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.1.0.dev2026081005-release.conda + sha256: 068813780f05908b74446039e3bc076ff858669c289df3758208d50d57e521cf + md5: a4045e3986192990a25c55e7d9097fba depends: - python >=3.10 - - mojo-compiler ==1.0.0b3.dev2026072306 - - mblack ==26.5.0.dev2026072306 + - mojo-compiler ==1.1.0.dev2026081005 + - mblack ==26.6.0.dev2026081005 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 114481928 - timestamp: 1784787284605 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - sha256: 9495999b5a594da5f8da4887f049d399789bb32a89d566cc3f3789b012affee0 - md5: 0617686ea407895e1d0f5a163c9dc9d9 + run_exports: {} + size: 116005605 + timestamp: 1786340626272 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.1.0.dev2026081005-release.conda + sha256: e4910c6d72f9782eba05d548589569eb4bc3f910bb28b637120a397748889b31 + md5: 107388d6679e1c50abd58b315022d6b6 depends: - - mojo-python ==1.0.0b3.dev2026072306 + - mojo-python ==1.1.0.dev2026081005 license: LicenseRef-Modular-Proprietary - size: 80568439 - timestamp: 1784787288159 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.5.0.dev2026072306-release.conda + run_exports: {} + size: 68677291 + timestamp: 1786340630154 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.6.0.dev2026081005-release.conda noarch: python - sha256: bd865b7cfd860d58166fd70fa6071a849033b8479b1e2948606f5165f4a83da1 - md5: 5fb41c53a605dea5a6d111688c4d4f8e + sha256: 5c3ef3e559c54054b5b8caf1c3c1fbc4e206ca612e21e92dbf129720bbd19ebc + md5: d576caede2b60aa8f548f6e6efc48afb depends: - python >=3.10 - click >=8.0.0 @@ -1775,33 +1777,37 @@ packages: - platformdirs >=2 - tomli >=1.1.0 license: LicenseRef-Modular-Proprietary - size: 135952 - timestamp: 1784787149546 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.0.0b3.dev2026072306-release.conda + run_exports: {} + size: 137551 + timestamp: 1786340494641 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.1.0.dev2026081005-release.conda noarch: python - sha256: 31997eb3977ccd43979f8032992a66e48e84e09c00406f85ae581046189b37ad - md5: 40933c74ecddff04ae43165667bcb42b + sha256: c5900f8776cc2bfa74da6d34fa8d3cac98a9ce8183d2a2dc29a5b35d7fb1a630 + md5: b37939bfd36b01fdf46173fd893bcdb3 depends: - python >=3.10 license: LicenseRef-Modular-Proprietary - size: 24123 - timestamp: 1784787149484 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.0.0b3.dev2026072306-release.conda - sha256: 69d7eda6b8b2c591ebf819326bc075879955fa1fb80da8d6eccbd91587026d7a - md5: 41723c21d61e78115129d3f5610c2bb1 + run_exports: {} + size: 24111 + timestamp: 1786340495055 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.1.0.dev2026081005-release.conda + sha256: c644e71aaf93f84dee787e470921bec24029fb3e95f9f4ccf4b7d492fe8e1453 + md5: 62d22e5ab8b019dbe1efd55dc8756bac depends: - python >=3.10 - - mojo-compiler ==1.0.0b3.dev2026072306 - - mblack ==26.5.0.dev2026072306 + - mojo-compiler ==1.1.0.dev2026081005 + - mblack ==26.6.0.dev2026081005 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 100044215 - timestamp: 1784787408862 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.0.0b3.dev2026072306-release.conda - sha256: 60bf486f8b3db0912c3f10c45967ec308332cf0e98f20ac92a999188d03934c5 - md5: 0462bec5462c0b3af77036b177c92a75 + run_exports: {} + size: 101496142 + timestamp: 1786340896112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.1.0.dev2026081005-release.conda + sha256: 0edf32fc5b430e4c1630710066238dcb6046863368735170b254da944aec37e4 + md5: 62df8911d4f311000dbb39624a610c9c depends: - - mojo-python ==1.0.0b3.dev2026072306 + - mojo-python ==1.1.0.dev2026081005 license: LicenseRef-Modular-Proprietary - size: 62030583 - timestamp: 1784787407344 + run_exports: {} + size: 61386190 + timestamp: 1786340891348 diff --git a/pixi.toml b/pixi.toml index 97330d3c..57e0810b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -33,8 +33,12 @@ format = """pixi run mojo format ./src \ # the source tree via `-I src`. Loading the pre-built package via # `-I tests` sidesteps that regression. The `package` task below is # therefore reordered so `package_decimo` runs before `doc`. +# `-I src/cli` resolves `limo` from source. Without it the step silently +# fell back to the stale `limo.mojopkg` left at the repo root, which the +# 1.1 compiler now rejects ("missing version information"); source also +# takes precedence over that legacy artifact, so it can be deleted. doc = """pixi run mojo doc --diagnose-missing-doc-strings src/decimo > /dev/null \ -&& pixi run mojo doc --diagnose-missing-doc-strings -I tests src/cli/calculator > /dev/null""" +&& pixi run mojo doc --diagnose-missing-doc-strings -I tests -I src/cli src/cli/calculator > /dev/null""" # compile the package p = "clear && pixi run package" diff --git a/python/decimo_module.mojo b/python/decimo_module.mojo index eca25d30..7d3dc65f 100644 --- a/python/decimo_module.mojo +++ b/python/decimo_module.mojo @@ -22,7 +22,7 @@ from decimo import BigDecimal @export -def PyInit__decimo() -> PythonObject: +def PyInit__decimo() abi("C") -> PythonObject: try: var m = PythonModuleBuilder("_decimo") _ = ( diff --git a/src/cli/calculator/io.mojo b/src/cli/calculator/io.mojo index 00d0f792..112fd9ea 100644 --- a/src/cli/calculator/io.mojo +++ b/src/cli/calculator/io.mojo @@ -189,7 +189,7 @@ def strip_comment(line: String) -> String: var ptr = bytes.unsafe_ptr() for i in range(n): - if ptr[i] == 35: # '#' + if ptr[unsafe_offset=i] == 35: # '#' if i == 0: return String("") return String(line[byte=0:i]) @@ -218,7 +218,7 @@ def is_blank(line: String) -> Bool: var ptr = bytes.unsafe_ptr() for i in range(n): - var c = ptr[i] + var c = ptr[unsafe_offset=i] if c != 32 and c != 9: # not space, not tab return False @@ -259,14 +259,14 @@ def strip(s: String) -> String: var end = s.byte_length() while start < end: - var c = ptr[start] + var c = ptr[unsafe_offset=start] # space=32, tab=9, \r=13, \n=10 if c != 32 and c != 9 and c != 13 and c != 10: break start += 1 while end > start: - var c = ptr[end - 1] + var c = ptr[unsafe_offset=end - 1] if c != 32 and c != 9 and c != 13 and c != 10: break end -= 1 diff --git a/src/cli/limo/line_editor.mojo b/src/cli/limo/line_editor.mojo index 9eb84fb6..2041b831 100644 --- a/src/cli/limo/line_editor.mojo +++ b/src/cli/limo/line_editor.mojo @@ -98,9 +98,9 @@ struct LineEditor(Movable): self._history = List[String]() self._max_history = max_history if max_history >= 0 else 0 - def __init__(out self, *, deinit take: Self): - self._history = take._history^ - self._max_history = take._max_history + def __init__(out self, *, deinit move: Self): + self._history = move._history^ + self._max_history = move._max_history def read_line(mut self, prompt: String) raises -> Optional[String]: """Displays a prompt and reads a line with full editing support. diff --git a/src/cli/limo/terminal.mojo b/src/cli/limo/terminal.mojo index ca821a84..84fd21b2 100644 --- a/src/cli/limo/terminal.mojo +++ b/src/cli/limo/terminal.mojo @@ -128,8 +128,8 @@ struct TermIOS(Copyable, Movable): def __init__(out self, *, copy: Self): self._buf = copy._buf.copy() - def __init__(out self, *, deinit take: Self): - self._buf = take._buf^ + def __init__(out self, *, deinit move: Self): + self._buf = move._buf^ def copy(self) -> Self: """Returns an explicit copy.""" diff --git a/src/decimo/bigdecimal/bigdecimal.mojo b/src/decimo/bigdecimal/bigdecimal.mojo index d324f67f..2942066e 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -23,7 +23,7 @@ operation dunders, and other dunders that implement traits, as well as mathematical methods that do not implement a trait. """ -from std.memory import UnsafePointer +from std.memory import Pointer from std.python import PythonObject from std import testing @@ -468,7 +468,7 @@ struct BigDecimal( Raises: ValueError: If the string does not represent a valid number. """ - _tuple = decimo_str.parse_numeric_string(value) + var _tuple = decimo_str.parse_numeric_string(value) ref coef: List[UInt8] = _tuple[0] var scale: Int = _tuple[1] var sign: Bool = _tuple[2] @@ -478,7 +478,7 @@ struct BigDecimal( if number_of_digits % 9 != 0: number_of_words += 1 - coefficient_words = List[UInt32](capacity=number_of_words) + var coefficient_words = List[UInt32](capacity=number_of_words) var end: Int = number_of_digits var start: Int @@ -495,7 +495,7 @@ struct BigDecimal( word = word * 10 + UInt32(coef[i]) coefficient_words.append(word) - coefficient = BigUInt(raw_words=coefficient_words^) + var coefficient = BigUInt(raw_words=coefficient_words^) return Self(coefficient=coefficient^, scale=scale, sign=sign) @@ -758,15 +758,15 @@ struct BigDecimal( # Strip trailing zeros (artifacts of working precision) var coef = coefficient_string - var cb = StringSlice(coef).as_bytes() - var clen = len(cb) - var cptr = cb.unsafe_ptr() - while clen > 1 and cptr[clen - 1] == 48: # '0' + var coef_byte = StringSlice(coef).as_bytes() + var clen = len(coef_byte) + var cptr = coef_byte.unsafe_ptr() + while clen > 1 and cptr[unsafe_offset=clen - 1] == 48: # '0' clen -= 1 if clen < num_digits: var trimmed = List[UInt8](capacity=clen) for i in range(clen): - trimmed.append(cptr[i]) + trimmed.append(cptr[unsafe_offset=i]) coef = String(unsafe_from_utf8=trimmed^) # Zero-pad the right side if fewer sig-digits than lead_digits @@ -799,15 +799,17 @@ struct BigDecimal( # preserve all digits so that __str__ stays round-trip safe. var coef = coefficient_string if scientific: - var cb = StringSlice(coef).as_bytes() - var clen = len(cb) - var cptr = cb.unsafe_ptr() - while clen > 1 and cptr[clen - 1] == 48: # ord('0') + var coef_byte = StringSlice(coef).as_bytes() + var clen = len(coef_byte) + var cptr = coef_byte.unsafe_ptr() + while ( + clen > 1 and cptr[unsafe_offset=clen - 1] == 48 + ): # ord('0') clen -= 1 if clen < num_digits: var trimmed = List[UInt8](capacity=clen) for i in range(clen): - trimmed.append(cptr[i]) + trimmed.append(cptr[unsafe_offset=i]) coef = String(unsafe_from_utf8=trimmed^) result += coef[byte=0] if coef.byte_length() > 1: @@ -2489,12 +2491,12 @@ struct BigDecimal( instead of a `Tuple[int]` for better performance in Mojo. """ var coef_str = self.coefficient.to_string() - var cb = StringSlice(coef_str).as_bytes() - var n = len(cb) - var ptr = cb.unsafe_ptr() + var coef_byte = StringSlice(coef_str).as_bytes() + var n = len(coef_byte) + var ptr = coef_byte.unsafe_ptr() var digits = List[UInt8](capacity=n) for i in range(n): - digits.append(ptr[i] - 48) # 48 == ord('0') + digits.append(ptr[unsafe_offset=i] - 48) # 48 == ord('0') return (self.sign, digits^, -self.scale) @always_inline @@ -2881,7 +2883,9 @@ struct BigDecimal( number_of_digits_to_remove % 9 ) - words = List[UInt32](self.coefficient.words[number_of_words_to_remove:]) + var words = List[UInt32]( + self.coefficient.words[number_of_words_to_remove:] + ) var coefficient = BigUInt(raw_words=words^) if number_of_remaining_digits_to_remove == 0: @@ -2984,20 +2988,20 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: # Locate optional leading minus (ASCII 45) var start = 0 - if n > 0 and ptr[0] == 45: + if n > 0 and ptr[unsafe_offset=0] == 45: start = 1 # Locate optional exponent suffix 'E' (ASCII 69) var e_pos = n # points past end if no 'E' for i in range(start, n): - if ptr[i] == 69: + if ptr[unsafe_offset=i] == 69: e_pos = i break # Locate optional decimal point '.' (ASCII 46) within the mantissa var dot_pos = -1 for i in range(start, e_pos): - if ptr[i] == 46: + if ptr[unsafe_offset=i] == 46: dot_pos = i break diff --git a/src/decimo/bigdecimal/exponential.mojo b/src/decimo/bigdecimal/exponential.mojo index 016c4817..44d37621 100644 --- a/src/decimo/bigdecimal/exponential.mojo +++ b/src/decimo/bigdecimal/exponential.mojo @@ -469,7 +469,7 @@ def root(x: BigDecimal, n: BigDecimal, precision: Int) raises -> BigDecimal: var result = integer_root(x, n, precision) _strip_trailing_fractional_zeros(result) return result^ - _tuple = is_integer_reciprocal_and_return(n) + var _tuple = is_integer_reciprocal_and_return(n) var is_integer_reciprocal: Bool = _tuple[0] ref integer_reciprocal: BigDecimal = _tuple[1] if is_integer_reciprocal: @@ -485,7 +485,7 @@ def root(x: BigDecimal, n: BigDecimal, precision: Int) raises -> BigDecimal: # Only for non-negative x: fractional roots of negative numbers # are disallowed (consistent with Python Decimal behavior). if not x.sign: - _rtuple = _rational_root_decomposition(n) + var _rtuple = _rational_root_decomposition(n) var is_rational: Bool = _rtuple[0] var root_order: Int = _rtuple[1] var power_order: Int = _rtuple[2] @@ -1781,7 +1781,7 @@ def cbrt(x: BigDecimal, precision: Int) raises -> BigDecimal: Error: Propagated from integer_root. """ - result = integer_root( + var result = integer_root( x, BigDecimal(coefficient=BigUInt(raw_words=[3]), scale=0, sign=False), precision, diff --git a/src/decimo/bigdecimal/trigonometric.mojo b/src/decimo/bigdecimal/trigonometric.mojo index ef1b0699..564218dd 100644 --- a/src/decimo/bigdecimal/trigonometric.mojo +++ b/src/decimo/bigdecimal/trigonometric.mojo @@ -425,14 +425,11 @@ def tan_cot(x: BigDecimal, precision: Int, is_tan: Bool) raises -> BigDecimal: # cot(x) = cos(x) / sin(x) var sin_x: BigDecimal = sin(x_reduced, precision=working_precision) var cos_x: BigDecimal = cos(x_reduced, precision=working_precision) + var result: BigDecimal if is_tan: - result: BigDecimal = sin_x.true_divide( - cos_x, precision=working_precision - ) + result = sin_x.true_divide(cos_x, precision=working_precision) else: - result: BigDecimal = cos_x.true_divide( - sin_x, precision=working_precision - ) + result = cos_x.true_divide(sin_x, precision=working_precision) result.round_to_precision_inplace( precision, @@ -529,9 +526,11 @@ def arctan(x: BigDecimal, precision: Int) raises -> BigDecimal: comptime BUFFER_DIGITS = 9 # word-length, easy to append and trim var working_precision = precision + BUFFER_DIGITS - bdec_1 = BigDecimal.from_raw_components(UInt32(1), scale=0, sign=False) - bdec_2 = BigDecimal.from_raw_components(UInt32(2), scale=0, sign=False) - bdec_0d5 = BigDecimal.from_raw_components(UInt32(5), scale=1, sign=False) + var bdec_1 = BigDecimal.from_raw_components(UInt32(1), scale=0, sign=False) + var bdec_2 = BigDecimal.from_raw_components(UInt32(2), scale=0, sign=False) + var bdec_0d5 = BigDecimal.from_raw_components( + UInt32(5), scale=1, sign=False + ) var result: BigDecimal diff --git a/src/decimo/bigfloat/bigfloat.mojo b/src/decimo/bigfloat/bigfloat.mojo index 71ffd4c5..b9bb3970 100644 --- a/src/decimo/bigfloat/bigfloat.mojo +++ b/src/decimo/bigfloat/bigfloat.mojo @@ -34,7 +34,7 @@ Design: """ from std.ffi import external_call, c_char -from std.memory import UnsafePointer +from std.memory import Pointer from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.biguint.biguint import BigUInt @@ -168,7 +168,7 @@ struct BigFloat(Comparable, Movable, Writable): var s_bytes = value.as_bytes() var result_code = mpfrw_set_str( self.handle, - s_bytes.unsafe_ptr().bitcast[c_char](), + s_bytes.unsafe_ptr().unsafe_bitcast[c_char](), Int32(len(s_bytes)), ) if result_code != 0: @@ -218,16 +218,16 @@ struct BigFloat(Comparable, Movable, Writable): # Lifecycle # ===------------------------------------------------------------------=== # - def __init__(out self, *, deinit take: Self): + def __init__(out self, *, deinit move: Self): """Moves a BigFloat, transferring handle ownership. Args: - take: The instance to move from. + move: The instance to move from. """ - self.handle = take.handle - self.precision = take.precision + self.handle = move.handle + self.precision = move.precision - def __del__(deinit self): + def __deinit__(deinit self): """Frees the MPFR handle.""" if self.handle >= 0: mpfrw_clear(self.handle) @@ -335,7 +335,7 @@ struct BigFloat(Comparable, Movable, Writable): # Meaning: value = 0. × 10^exp. var exp = Int(0) var address = mpfrw_get_raw_digits( - self.handle, Int32(d), UnsafePointer(to=exp) + self.handle, Int32(d), Pointer(to=exp) ) if address == 0: raise ConversionError( @@ -357,7 +357,7 @@ struct BigFloat(Comparable, Movable, Writable): # Detect sign (negative values have '-' prefix from MPFR). var sign = False var digit_start = 0 - if n > 0 and ptr[0] == ASCII_MINUS: + if n > 0 and ptr[unsafe_offset=0] == ASCII_MINUS: sign = True digit_start = 1 @@ -377,13 +377,17 @@ struct BigFloat(Comparable, Movable, Writable): var start = end - 9 var word: UInt32 = 0 for j in range(start, end): - word = word * 10 + UInt32(ptr[digit_start + j] - ASCII_ZERO) + word = word * 10 + UInt32( + ptr[unsafe_offset=digit_start + j] - ASCII_ZERO + ) words.append(word) end = start if end > 0: var word: UInt32 = 0 for j in range(0, end): - word = word * 10 + UInt32(ptr[digit_start + j] - ASCII_ZERO) + word = word * 10 + UInt32( + ptr[unsafe_offset=digit_start + j] - ASCII_ZERO + ) words.append(word) var coefficient = BigUInt(raw_words=words^) diff --git a/src/decimo/bigfloat/mpfr_wrapper.mojo b/src/decimo/bigfloat/mpfr_wrapper.mojo index 13b7daae..344b95a3 100644 --- a/src/decimo/bigfloat/mpfr_wrapper.mojo +++ b/src/decimo/bigfloat/mpfr_wrapper.mojo @@ -75,15 +75,13 @@ def mpfrw_clear(handle: Int32): # ===----------------------------------------------------------------------=== # # String conversion # -# C returns malloc'd char* which Mojo can't represent as UnsafePointer[c_char] +# C returns malloc'd char* which Mojo can't represent as Pointer[c_char] # in return position (origin parameter can't be inferred). So we pass raw -# addresses as Int and reconstruct UnsafePointer at the call site. +# addresses as Int and reconstruct Pointer at the call site. # ===----------------------------------------------------------------------=== # -def mpfrw_set_str( - handle: Int32, s: UnsafePointer[c_char, _], length: Int32 -) -> Int32: +def mpfrw_set_str(handle: Int32, s: Pointer[c_char, _], length: Int32) -> Int32: """Sets the MPFR handle value from a decimal string. Args: @@ -126,7 +124,7 @@ def mpfrw_free_str(addr: Int): def mpfrw_get_raw_digits( - handle: Int32, digits: Int32, out_exp: UnsafePointer[Int, _] + handle: Int32, digits: Int32, out_exp: Pointer[Int, _] ) -> Int: """Exports MPFR value as raw digit string via mpfr_get_str. diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 1ab1d4cb..53cb71ce 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -27,7 +27,7 @@ for the Decimo library. It uses base-2^32 representation with UInt32 words in little-endian order, and a separate sign bit. """ -from std.memory import UnsafePointer, unsafe_memcpy +from std.memory import Pointer, unsafe_memcpy from std.sys import size_of import decimo.bigint.arithmetics as bigint_arithmetics @@ -370,6 +370,7 @@ struct BigInt( ConversionError: If the string cannot be parsed as an integer. """ # Use the shared string parser for format handling + var _tuple: Tuple[List[UInt8], Int, Bool] try: _tuple = decimo_str.parse_numeric_string(value) except e: @@ -2420,11 +2421,11 @@ def _magnitude_to_decimal_simple(words: List[UInt32], eff_words: Int) -> String: while div_len > 0: var remainder: UInt64 = 0 for i in range(div_len - 1, -1, -1): - var temp = (remainder << 32) + UInt64(dp[i]) - dp[i] = UInt32(temp // _DECIMAL_CHUNK_BASE) + var temp = (remainder << 32) + UInt64(dp[unsafe_offset=i]) + dp[unsafe_offset=i] = UInt32(temp // _DECIMAL_CHUNK_BASE) remainder = temp % _DECIMAL_CHUNK_BASE - while div_len > 0 and dp[div_len - 1] == 0: + while div_len > 0 and dp[unsafe_offset=div_len - 1] == 0: div_len -= 1 chunks.append(UInt32(remainder)) @@ -2439,7 +2440,7 @@ def _magnitude_to_decimal_simple(words: List[UInt32], eff_words: Int) -> String: # Most-significant chunk: no zero-padding. var msb = Int(chunks[num_chunks - 1]) - var msb_digits = InlineArray[UInt8, 10](fill=0) + var msb_digits = Array[UInt8, 10](fill=0) var msb_len = 0 if msb == 0: buf.append(48) # '0' @@ -2455,7 +2456,7 @@ def _magnitude_to_decimal_simple(words: List[UInt32], eff_words: Int) -> String: # Remaining chunks: zero-padded to exactly 9 digits. for ci in range(num_chunks - 2, -1, -1): var val = Int(chunks[ci]) - var digits9 = InlineArray[UInt8, 9](fill=48) # pre-fill '0' + var digits9 = Array[UInt8, 9](fill=48) # pre-fill '0' for d in range(9): digits9[8 - d] = UInt8(val % 10) + 48 val //= 10 @@ -2592,12 +2593,12 @@ def _dc_to_str_recursive( var buf = List[UInt8](capacity=total_len) # Copy high_str bytes for i in range(high_str.byte_length()): - buf.append(high_str.unsafe_ptr()[i]) + buf.append(high_str.unsafe_ptr()[unsafe_offset=i]) # Write zero padding for _ in range(padding): buf.append(48) # ASCII '0' # Copy low_str bytes for i in range(low_str.byte_length()): - buf.append(low_str.unsafe_ptr()[i]) + buf.append(low_str.unsafe_ptr()[unsafe_offset=i]) return String(unsafe_from_utf8=buf^) diff --git a/src/decimo/bigint10/bigint10.mojo b/src/decimo/bigint10/bigint10.mojo index e3ba0466..1774ff7c 100644 --- a/src/decimo/bigint10/bigint10.mojo +++ b/src/decimo/bigint10/bigint10.mojo @@ -23,7 +23,7 @@ operation dunders, and other dunders that implement traits, as well as mathematical methods that do not implement a trait. """ -from std.memory import UnsafePointer +from std.memory import Pointer from std.python import PythonObject import decimo.bigint10.arithmetics as bigint10_arithmetics @@ -362,6 +362,7 @@ struct BigInt10( Raises: ConversionError: If the string cannot be parsed. """ + var _tuple: Tuple[List[UInt8], Int, Bool] try: _tuple = decimo_str.parse_numeric_string(value) except e: @@ -381,7 +382,7 @@ struct BigInt10( if len(coef) == 1 and coef[0] == UInt8(0): return Self(UInt32(0), sign=False) - magnitude = BigUInt.from_string(value, ignore_sign=True) + var magnitude = BigUInt.from_string(value, ignore_sign=True) return Self(magnitude=magnitude^, sign=sign) diff --git a/src/decimo/biguint/arithmetics.mojo b/src/decimo/biguint/arithmetics.mojo index 6668bd9d..33932323 100644 --- a/src/decimo/biguint/arithmetics.mojo +++ b/src/decimo/biguint/arithmetics.mojo @@ -241,8 +241,8 @@ def add_slices( `add_slices_simd()` to handle the addition of the two BigUInt slices. """ - n_words_x_slice = bounds_x[1] - bounds_x[0] - n_words_y_slice = bounds_y[1] - bounds_y[0] + var n_words_x_slice = bounds_x[1] - bounds_x[0] + var n_words_y_slice = bounds_y[1] - bounds_y[0] # Short circuit cases if n_words_x_slice == 1: @@ -318,10 +318,12 @@ def add_slices_simd( def vector_add[ simd_width: Int ](i: Int) {mut result, imm x, imm y, imm bounds_x, imm bounds_y}: - result.words.unsafe_ptr().store[width=simd_width]( + result.words.unsafe_ptr().unsafe_store[width=simd_width]( i, - x.words.unsafe_ptr().load[width=simd_width](i + bounds_x[0]) - + y.words.unsafe_ptr().load[width=simd_width](i + bounds_y[0]), + x.words.unsafe_ptr().unsafe_load[width=simd_width](i + bounds_x[0]) + + y.words.unsafe_ptr().unsafe_load[width=simd_width]( + i + bounds_y[0] + ), ) vectorize[BigUInt.VECTOR_WIDTH]( @@ -349,11 +351,13 @@ def add_slices_simd( ](i: Int) { mut result, imm longer, imm n_words_shorter_slice, imm longer_start }: - result.words.unsafe_ptr().store[width=simd_width]( + result.words.unsafe_ptr().unsafe_store[width=simd_width]( n_words_shorter_slice + i, longer[] .words.unsafe_ptr() - .load[width=simd_width](longer_start + n_words_shorter_slice + i), + .unsafe_load[width=simd_width]( + longer_start + n_words_shorter_slice + i + ), ) vectorize[BigUInt.VECTOR_WIDTH]( @@ -400,10 +404,10 @@ def add_inplace(mut x: BigUInt, y: BigUInt) -> None: x.words.resize(length=len(y.words), fill=UInt32(0)) def vector_add[simd_width: Int](i: Int) {mut x, imm y}: - x.words.unsafe_ptr().store[width=simd_width]( + x.words.unsafe_ptr().unsafe_store[width=simd_width]( i, - x.words.unsafe_ptr().load[width=simd_width](i) - + y.words.unsafe_ptr().load[width=simd_width](i), + x.words.unsafe_ptr().unsafe_load[width=simd_width](i) + + y.words.unsafe_ptr().unsafe_load[width=simd_width](i), ) vectorize[BigUInt.VECTOR_WIDTH](len(y.words), vector_add) @@ -450,10 +454,12 @@ def add_by_slice_inplace( x.words.resize(length=n_words_y_slice, fill=UInt32(0)) def vector_add[simd_width: Int](i: Int) {mut x, imm y, imm bounds_y}: - x.words.unsafe_ptr().store[width=simd_width]( + x.words.unsafe_ptr().unsafe_store[width=simd_width]( i, - x.words.unsafe_ptr().load[width=simd_width](i) - + y.words.unsafe_ptr().load[width=simd_width](i + bounds_y[0]), + x.words.unsafe_ptr().unsafe_load[width=simd_width](i) + + y.words.unsafe_ptr().unsafe_load[width=simd_width]( + i + bounds_y[0] + ), ) vectorize[BigUInt.VECTOR_WIDTH](n_words_y_slice, vector_add) @@ -657,18 +663,20 @@ def subtract_simd(x: BigUInt, y: BigUInt) raises -> BigUInt: # Note that there will be potential overflow in the subtraction, # but we will take advantage of that. def vector_subtract[simd_width: Int](i: Int) {mut result, imm x, imm y}: - result.words.unsafe_ptr().store[width=simd_width]( + result.words.unsafe_ptr().unsafe_store[width=simd_width]( i, - x.words.unsafe_ptr().load[width=simd_width](i) - - y.words.unsafe_ptr().load[width=simd_width](i), + x.words.unsafe_ptr().unsafe_load[width=simd_width](i) + - y.words.unsafe_ptr().unsafe_load[width=simd_width](i), ) vectorize[BigUInt.VECTOR_WIDTH](len(y.words), vector_subtract) def vector_copy_rest[simd_width: Int](i: Int) {mut result, imm x, imm y}: - result.words.unsafe_ptr().store[width=simd_width]( + result.words.unsafe_ptr().unsafe_store[width=simd_width]( len(y.words) + i, - x.words.unsafe_ptr().load[width=simd_width](len(y.words) + i), + x.words.unsafe_ptr().unsafe_load[width=simd_width]( + len(y.words) + i + ), ) vectorize[BigUInt.VECTOR_WIDTH]( @@ -723,10 +731,10 @@ def subtract_inplace(mut x: BigUInt, y: BigUInt) raises -> None: # Note that len(x.words) >= len(y.words) here # Use SIMD operations to subtract the words in parallel. def vector_subtract[simd_width: Int](i: Int) {mut x, imm y}: - x.words.unsafe_ptr().store[width=simd_width]( + x.words.unsafe_ptr().unsafe_store[width=simd_width]( i, - x.words.unsafe_ptr().load[width=simd_width](i) - - y.words.unsafe_ptr().load[width=simd_width](i), + x.words.unsafe_ptr().unsafe_load[width=simd_width](i) + - y.words.unsafe_ptr().unsafe_load[width=simd_width](i), ) vectorize[BigUInt.VECTOR_WIDTH](len(y.words), vector_subtract) @@ -763,10 +771,10 @@ def subtract_no_check_inplace(mut x: BigUInt, y: BigUInt) -> None: # Note that len(x.words) >= len(y.words) under this assumption def vector_subtract[simd_width: Int](i: Int) {mut x, imm y}: - x.words.unsafe_ptr().store[width=simd_width]( + x.words.unsafe_ptr().unsafe_store[width=simd_width]( i, - x.words.unsafe_ptr().load[width=simd_width](i) - - y.words.unsafe_ptr().load[width=simd_width](i), + x.words.unsafe_ptr().unsafe_load[width=simd_width](i) + - y.words.unsafe_ptr().unsafe_load[width=simd_width](i), ) vectorize[BigUInt.VECTOR_WIDTH](len(y.words), vector_subtract) @@ -925,8 +933,8 @@ def multiply_slices( multiplication for medium numbers (65–256 words), and Toom-3 multiplication for large numbers (>256 words). """ - n_words_x_slice = bounds_x[1] - bounds_x[0] - n_words_y_slice = bounds_y[1] - bounds_y[0] + var n_words_x_slice = bounds_x[1] - bounds_x[0] + var n_words_y_slice = bounds_y[1] - bounds_y[0] # CASE 1 # The allocation cost is too high for small numbers to use Karatsuba @@ -968,8 +976,8 @@ def multiply_slices_schoolbook( The product of the two BigUInt slices. """ - n_words_x_slice = bounds_x[1] - bounds_x[0] - n_words_y_slice = bounds_y[1] - bounds_y[0] + var n_words_x_slice = bounds_x[1] - bounds_x[0] + var n_words_y_slice = bounds_y[1] - bounds_y[0] # CASE: One of the operands is zero or one if n_words_x_slice == 1: @@ -1131,11 +1139,13 @@ def multiply_slices_deferred_carry( var highest_column = 0 # highest accumulator index touched + 1 for i in range(n_words_x_slice): - var x_word = UInt64(x_words_ptr[start_x + i]) + var x_word = UInt64(x_words_ptr[unsafe_offset=start_x + i]) if x_word == 0: continue for j in range(n_words_y_slice): - column_sums_ptr[i + j] += x_word * UInt64(y_words_ptr[start_y + j]) + column_sums_ptr[unsafe_offset=i + j] += x_word * UInt64( + y_words_ptr[unsafe_offset=start_y + j] + ) if i + n_words_y_slice > highest_column: highest_column = i + n_words_y_slice rows_since_normalization += 1 @@ -1143,13 +1153,13 @@ def multiply_slices_deferred_carry( # Propagate base-10^9 carries across the touched range. var carry: UInt64 = 0 for k in range(highest_column): - var column_value = column_sums_ptr[k] + carry - column_sums_ptr[k] = column_value % BASE + var column_value = column_sums_ptr[unsafe_offset=k] + carry + column_sums_ptr[unsafe_offset=k] = column_value % BASE carry = column_value // BASE var k = highest_column while carry > 0: - var column_value = column_sums_ptr[k] + carry - column_sums_ptr[k] = column_value % BASE + var column_value = column_sums_ptr[unsafe_offset=k] + carry + column_sums_ptr[unsafe_offset=k] = column_value % BASE carry = column_value // BASE k += 1 if k > highest_column: @@ -1160,7 +1170,7 @@ def multiply_slices_deferred_carry( var result = BigUInt(uninitialized_capacity=result_length) var carry: UInt64 = 0 for k in range(result_length): - var column_value = column_sums_ptr[k] + carry + var column_value = column_sums_ptr[unsafe_offset=k] + carry result.words.append(UInt32(column_value % BASE)) carry = column_value // BASE @@ -1723,8 +1733,8 @@ def multiply_by_uint32_le_4_inplace(mut x: BigUInt, y: UInt32): # y is 2, we can just shift the digits of each word to the left by 1 def vector_multiply_by_2[simd_width: Int](i: Int) {mut x}: """Shifts the digits of each word to the left by 1.""" - x.words.unsafe_ptr().store[width=simd_width]( - i, x.words.unsafe_ptr().load[width=simd_width](i) << 1 + x.words.unsafe_ptr().unsafe_store[width=simd_width]( + i, x.words.unsafe_ptr().unsafe_load[width=simd_width](i) << 1 ) if y == 2: @@ -1735,8 +1745,8 @@ def multiply_by_uint32_le_4_inplace(mut x: BigUInt, y: UInt32): # y is 3, we can just multiply the digits of each word by 3 def vector_multiply_by_3[simd_width: Int](i: Int) {mut x}: """Multiplies the digits of each word by 3.""" - x.words.unsafe_ptr().store[width=simd_width]( - i, x.words.unsafe_ptr().load[width=simd_width](i) * 3 + x.words.unsafe_ptr().unsafe_store[width=simd_width]( + i, x.words.unsafe_ptr().unsafe_load[width=simd_width](i) * 3 ) if y == 3: @@ -1747,8 +1757,8 @@ def multiply_by_uint32_le_4_inplace(mut x: BigUInt, y: UInt32): # y is 4, we can just shift the digits of each word to the left by 2 def vector_multiply_by_4[simd_width: Int](i: Int) {mut x}: """Shifts the digits of each word to the left by 2.""" - x.words.unsafe_ptr().store[width=simd_width]( - i, x.words.unsafe_ptr().load[width=simd_width](i) << 2 + x.words.unsafe_ptr().unsafe_store[width=simd_width]( + i, x.words.unsafe_ptr().unsafe_load[width=simd_width](i) << 2 ) if y == 4: @@ -1876,7 +1886,7 @@ def multiply_by_power_of_ten_inplace(mut x: BigUInt, n: Int): # For example, if n = 10, we add two words # The most significant word may not be used # We need to make sure that it is initialized to zero finally - x_original_length = len(x.words) + var x_original_length = len(x.words) x.words.resize( unsafe_uninit_length=len(x.words) + number_of_zero_words + 1 ) # New length = original length + number of zero words + 1 @@ -2333,7 +2343,7 @@ def floor_divide_estimate_quotient( # We can safely load 3 words: r0, r1, r2 numerator = ( dividend.words.unsafe_ptr() - .load[width=4](base_index) + .unsafe_load[width=4](base_index) .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, 1_000_000_000_000_000_000, 0 @@ -2343,7 +2353,7 @@ def floor_divide_estimate_quotient( # We can safely load 2 words: r0, r1 (r2 = 0) numerator = ( dividend.words.unsafe_ptr() - .load[width=2](base_index) + .unsafe_load[width=2](base_index) .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() @@ -2363,7 +2373,7 @@ def floor_divide_estimate_quotient( ) denominator = ( divisor.words.unsafe_ptr() - .load[width=2](len(divisor.words) - 2) + .unsafe_load[width=2](len(divisor.words) - 2) .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() @@ -2429,8 +2439,8 @@ def floor_divide_by_uint32(x: BigUInt, y: UInt32) -> BigUInt: var x_ptr = x.words.unsafe_ptr() var res_ptr = result.words.unsafe_ptr() for i in range(len(x.words) - 2, -1, -1): - dividend = carry * UInt64(BigUInt.BASE) + UInt64(x_ptr[i]) - res_ptr[i] = UInt32(dividend // y_uint64) + dividend = carry * UInt64(BigUInt.BASE) + UInt64(x_ptr[unsafe_offset=i]) + res_ptr[unsafe_offset=i] = UInt32(dividend // y_uint64) carry = dividend % y_uint64 debug_assert[assert_mode="none"]( @@ -2506,7 +2516,9 @@ def floor_divide_by_uint64(x: BigUInt, y: UInt64) -> BigUInt: var dividend = ( carry * UInt128(1_000_000_000_000_000_000) + ( - x.words.unsafe_ptr().load[width=2](i - 1).cast[DType.uint128]() + x.words.unsafe_ptr() + .unsafe_load[width=2](i - 1) + .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() ) @@ -2542,7 +2554,9 @@ def floor_divide_by_uint64_inplace(mut x: BigUInt, y: UInt64) -> None: var dividend = ( carry * UInt128(1_000_000_000_000_000_000) + ( - x.words.unsafe_ptr().load[width=2](i - 1).cast[DType.uint128]() + x.words.unsafe_ptr() + .unsafe_load[width=2](i - 1) + .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() ) @@ -2581,7 +2595,7 @@ def floor_divide_by_uint128(x: BigUInt, y: UInt128) -> BigUInt: carry = UInt256( ( x.words.unsafe_ptr() - .load[width=2](len(x.words) - 2) + .unsafe_load[width=2](len(x.words) - 2) .cast[DType.uint64]() * SIMD[DType.uint64, 2](1, 1_000_000_000) ).reduce_add() @@ -2591,7 +2605,7 @@ def floor_divide_by_uint128(x: BigUInt, y: UInt128) -> BigUInt: carry = UInt256( ( x.words.unsafe_ptr() - .load[width=4](len(x.words) - 3) + .unsafe_load[width=4](len(x.words) - 3) .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, 1_000_000_000_000_000_000, 0 @@ -2606,7 +2620,9 @@ def floor_divide_by_uint128(x: BigUInt, y: UInt128) -> BigUInt: var dividend = ( carry * UInt256(1_000_000_000_000_000_000_000_000_000_000_000_000) + ( - x.words.unsafe_ptr().load[width=4](i - 3).cast[DType.uint256]() + x.words.unsafe_ptr() + .unsafe_load[width=4](i - 3) + .cast[DType.uint256]() * SIMD[DType.uint256, 4]( 1, 1_000_000_000, @@ -3014,7 +3030,7 @@ def floor_divide_burnikel_ziegler( # The first iteration, we can use the slize of normalized_a # TODO: Refine this when Mojo support move values of unpacked tuples # https://github.com/modular/modular/issues/5330 - _tuple = floor_divide_slices_two_by_one( + var _tuple = floor_divide_slices_two_by_one( normalized_a, normalized_b, bounds_a=((t - 2) * n, len(normalized_a.words)), @@ -3025,7 +3041,7 @@ def floor_divide_burnikel_ziegler( q = _tuple[0].copy() z = _tuple[1].copy() else: - _tuple = floor_divide_slices_two_by_one( + var _tuple = floor_divide_slices_two_by_one( z, normalized_b, bounds_a=(0, len(z.words)), @@ -3095,7 +3111,7 @@ def floor_divide_two_by_one( var b1 = BigUInt.from_slice(b, bounds=(n // 2, n)) # TODO: Refine this when Mojo support move values of unpacked tuples - _tuple = floor_divide_three_by_two( + var _tuple = floor_divide_three_by_two( a3, a2, a1, b1, b0, n // 2, cut_off ) # q is q1 var q = _tuple[0].copy() @@ -3158,7 +3174,7 @@ def floor_divide_three_by_two( multiply_by_power_of_billion_inplace(a2a1, n) a2a1 += a1 # TODO: Refine this when Mojo support move values of unpacked tuples - _tuple = floor_divide_two_by_one(a2a1, b1, n, cut_off) + var _tuple = floor_divide_two_by_one(a2a1, b1, n, cut_off) var q = _tuple[0].copy() ref c = _tuple[1] # c is the carry var d = q * b0 @@ -3254,7 +3270,7 @@ def floor_divide_slices_two_by_one( # We just need to use three-by-two division once: a2a1a0 // b1b0 # Note that the condition must be short-circuited to avoid slicing # an empty BigUInt. - _tuple = floor_divide_slices_three_by_two( + var _tuple = floor_divide_slices_three_by_two( a, b, bounds_a, bounds_b, n // 2, cut_off ) # _tuple = (q, r) @@ -3265,7 +3281,7 @@ def floor_divide_slices_two_by_one( # We use the most significant three parts of the dividend # a3a2a1 // b1b0 - _tuple = floor_divide_slices_three_by_two( + var _tuple = floor_divide_slices_three_by_two( a, b, bounds_a1a3, bounds_b, n // 2, cut_off ) var q = _tuple[0].copy() # q is q1 @@ -3344,7 +3360,7 @@ def floor_divide_slices_three_by_two( var bounds_b1 = (bounds_b[0] + n, bounds_b[1]) var bounds_b0 = (bounds_b[0], bounds_b[0] + n) - _tuple = floor_divide_slices_two_by_one( + var _tuple = floor_divide_slices_two_by_one( a, b, bounds_a2a1, bounds_b1, n, cut_off ) var q = _tuple[0].copy() @@ -3952,6 +3968,7 @@ def calculate_ndigits_for_normalization(msw: UInt32) -> Int: This is a helper function for division algorithms. The normalized word should be as close to BASE as possible. """ + var ndigits: Int if msw < 10_000: if msw < 100: if msw < 10: @@ -3993,11 +4010,15 @@ def to_uint64_with_2_words(a: BigUInt, bounds_x: Tuple[Int, Int]) -> UInt64: var n_words = bounds_x[1] - bounds_x[0] if n_words == 1: return ( - a.words.unsafe_ptr().load[width=1](bounds_x[0]).cast[DType.uint64]() + a.words.unsafe_ptr() + .unsafe_load[width=1](bounds_x[0]) + .cast[DType.uint64]() ) else: return ( - a.words.unsafe_ptr().load[width=2](bounds_x[0]).cast[DType.uint64]() + a.words.unsafe_ptr() + .unsafe_load[width=2](bounds_x[0]) + .cast[DType.uint64]() * SIMD[DType.uint64, 2](1, 1_000_000_000) ).reduce_add() @@ -4016,13 +4037,13 @@ def to_uint128_with_2_words(a: BigUInt, bounds_x: Tuple[Int, Int]) -> UInt128: if n_words == 1: return ( a.words.unsafe_ptr() - .load[width=1](bounds_x[0]) + .unsafe_load[width=1](bounds_x[0]) .cast[DType.uint128]() ) else: return ( a.words.unsafe_ptr() - .load[width=2](bounds_x[0]) + .unsafe_load[width=2](bounds_x[0]) .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() @@ -4042,20 +4063,20 @@ def to_uint128_with_4_words(a: BigUInt, bounds_x: Tuple[Int, Int]) -> UInt128: if n_words == 1: return ( a.words.unsafe_ptr() - .load[width=1](bounds_x[0]) + .unsafe_load[width=1](bounds_x[0]) .cast[DType.uint128]() ) elif n_words == 2: return ( a.words.unsafe_ptr() - .load[width=2](bounds_x[0]) + .unsafe_load[width=2](bounds_x[0]) .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() elif n_words == 3: return ( a.words.unsafe_ptr() - .load[width=4](bounds_x[0]) + .unsafe_load[width=4](bounds_x[0]) .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, 1_000_000_000_000_000_000, 0 @@ -4064,7 +4085,7 @@ def to_uint128_with_4_words(a: BigUInt, bounds_x: Tuple[Int, Int]) -> UInt128: else: # len(self.words) == 4 return ( a.words.unsafe_ptr() - .load[width=4](bounds_x[0]) + .unsafe_load[width=4](bounds_x[0]) .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index 3dc7da8a..aab16fc7 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -23,7 +23,7 @@ operation dunders, and other dunders that implement traits, as well as mathematical methods that do not implement a trait. """ -from std.memory import UnsafePointer, unsafe_memcpy, memcmp +from std.memory import Pointer, unsafe_memcpy, memcmp from decimo.bigint10.bigint10 import BigInt10 import decimo.biguint.arithmetics as biguint_arithmetics @@ -440,7 +440,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): return Self() # Now we can safely copy the words - result = BigUInt(unsafe_uninit_length=n_words) + var result = BigUInt(unsafe_uninit_length=n_words) unsafe_memcpy( dest=result.words._data, src=value.words._data.unsafe_offset(start_index), @@ -658,7 +658,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): Returns: The BigUInt representation of the string. """ - _tuple = decimo_str.parse_numeric_string(value) + var _tuple = decimo_str.parse_numeric_string(value) ref coef: List[UInt8] = _tuple[0] var scale: Int = _tuple[1] var sign: Bool = _tuple[2] @@ -865,15 +865,23 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): ) if len(self.words) == 1: - return self.words.unsafe_ptr().load[width=1]().cast[DType.uint64]() + return ( + self.words.unsafe_ptr() + .unsafe_load[width=1]() + .cast[DType.uint64]() + ) elif len(self.words) == 2: return ( - self.words.unsafe_ptr().load[width=2]().cast[DType.uint64]() + self.words.unsafe_ptr() + .unsafe_load[width=2]() + .cast[DType.uint64]() * SIMD[DType.uint64, 2](1, 1_000_000_000) ).reduce_add() else: return ( - self.words.unsafe_ptr().load[width=4]().cast[DType.uint64]() + self.words.unsafe_ptr() + .unsafe_load[width=4]() + .cast[DType.uint64]() * SIMD[DType.uint64, 4]( 1, 1_000_000_000, @@ -892,10 +900,16 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): The `UInt64` representation of the first two words. """ if len(self.words) == 1: - return self.words.unsafe_ptr().load[width=1]().cast[DType.uint64]() + return ( + self.words.unsafe_ptr() + .unsafe_load[width=1]() + .cast[DType.uint64]() + ) else: # len(self.words) == 2 return ( - self.words.unsafe_ptr().load[width=2]().cast[DType.uint64]() + self.words.unsafe_ptr() + .unsafe_load[width=2]() + .cast[DType.uint64]() * SIMD[DType.uint64, 2](1, 1_000_000_000) ).reduce_add() @@ -922,23 +936,31 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): if len(self.words) == 1: result = ( - self.words.unsafe_ptr().load[width=1]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=1]() + .cast[DType.uint128]() ) elif len(self.words) == 2: result = ( - self.words.unsafe_ptr().load[width=2]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=2]() + .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() elif len(self.words) == 3: result = ( - self.words.unsafe_ptr().load[width=4]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=4]() + .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, 1_000_000_000_000_000_000, 0 ) ).reduce_add() elif len(self.words) == 4: result = ( - self.words.unsafe_ptr().load[width=4]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=4]() + .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, @@ -948,7 +970,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): ).reduce_add() else: result = ( - self.words.unsafe_ptr().load[width=8]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=8]() + .cast[DType.uint128]() * SIMD[DType.uint128, 8]( 1, 1_000_000_000, @@ -974,22 +998,32 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): """ if len(self.words) == 1: - return self.words.unsafe_ptr().load[width=1]().cast[DType.uint128]() + return ( + self.words.unsafe_ptr() + .unsafe_load[width=1]() + .cast[DType.uint128]() + ) elif len(self.words) == 2: return ( - self.words.unsafe_ptr().load[width=2]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=2]() + .cast[DType.uint128]() * SIMD[DType.uint128, 2](1, 1_000_000_000) ).reduce_add() elif len(self.words) == 3: return ( - self.words.unsafe_ptr().load[width=4]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=4]() + .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, 1_000_000_000_000_000_000, 0 ) ).reduce_add() else: # len(self.words) == 4 return ( - self.words.unsafe_ptr().load[width=4]().cast[DType.uint128]() + self.words.unsafe_ptr() + .unsafe_load[width=4]() + .cast[DType.uint128]() * SIMD[DType.uint128, 4]( 1, 1_000_000_000, @@ -1069,13 +1103,13 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): var val = self.words[ci] for _ in range(9): pos -= 1 - p[pos] = UInt8(val % 10) + 48 + p[unsafe_offset=pos] = UInt8(val % 10) + 48 val //= 10 # Most-significant word: its `msb_len` digits, right-to-left. for _ in range(msb_len): pos -= 1 - p[pos] = UInt8(msb % 10) + 48 + p[unsafe_offset=pos] = UInt8(msb % 10) + 48 msb //= 10 result = String(unsafe_from_utf8=buf^) diff --git a/src/decimo/biguint/exponential.mojo b/src/decimo/biguint/exponential.mojo index 42c79d09..9962d8d1 100644 --- a/src/decimo/biguint/exponential.mojo +++ b/src/decimo/biguint/exponential.mojo @@ -57,7 +57,9 @@ def sqrt(x: BigUInt) -> BigUInt: var res = UInt32( math.sqrt( ( - x.words.unsafe_ptr().load[width=2]().cast[DType.uint64]() + x.words.unsafe_ptr() + .unsafe_load[width=2]() + .cast[DType.uint64]() * SIMD[DType.uint64, 2](1, 1_000_000_000) ).reduce_add() ) @@ -171,7 +173,7 @@ def sqrt_initial_guess(x: BigUInt) -> BigUInt: math.sqrt( ( x.words.unsafe_ptr() - .load[width=2](len(x.words) - 2) + .unsafe_load[width=2](len(x.words) - 2) .cast[DType.uint64]() * SIMD[DType.uint64, 2](1, 1_000_000_000) ).reduce_add() @@ -186,7 +188,7 @@ def sqrt_initial_guess(x: BigUInt) -> BigUInt: if nsw > 999_999_999: # Cap at max word value nsw = 999_999_999 - result = BigUInt(unsafe_uninit_length=n_words + 1) + var result = BigUInt(unsafe_uninit_length=n_words + 1) unsafe_memset_zero(ptr=result.words._data, count=n_words + 1) # Boundary checks are not needed here because len(x.words) > 2 result.words.unsafe_set(n_words, msw_sqrt) diff --git a/src/decimo/decimal128/decimal128.mojo b/src/decimo/decimal128/decimal128.mojo index b431cb12..377bfd4a 100644 --- a/src/decimo/decimal128/decimal128.mojo +++ b/src/decimo/decimal128/decimal128.mojo @@ -24,7 +24,7 @@ mathematical methods that do not implement a trait. """ from std.collections import Span -from std.memory import UnsafePointer +from std.memory import Pointer from std.hashlib.hasher import Hasher import decimo.decimal128.arithmetics as decimal128_arithmetics @@ -623,7 +623,7 @@ struct Decimal128( if scale > UInt32(Self.MAX_SCALE): Self._raise_from_uint128_scale_too_large(scale) - var result = UnsafePointer(to=value).bitcast[Decimal128]()[] + var result = Pointer(to=value).unsafe_bitcast[Decimal128]()[] result.flags |= (scale << Self.SCALE_SHIFT) & Self.SCALE_MASK result.flags |= UInt32(sign) << 31 @@ -952,7 +952,9 @@ struct Decimal128( ) # Extract binary exponent using IEEE 754 bit manipulation - var bits: UInt64 = UnsafePointer(to=abs_value).bitcast[UInt64]().load() + var bits: UInt64 = ( + Pointer(to=abs_value).unsafe_bitcast[UInt64]().unsafe_load() + ) var biased_exponent: Int = Int((bits >> 52) & 0x7FF) # print("DEBUG: biased_exponent = ", biased_exponent) @@ -1110,7 +1112,7 @@ struct Decimal128( comptime BUF_SIZE = 32 comptime ZERO_ASCII = UInt8(48) comptime TEN9: UInt128 = 1_000_000_000 - var buf = InlineArray[UInt8, BUF_SIZE](uninitialized=True) + var buf = Array[UInt8, BUF_SIZE](uninitialized=True) var pos = BUF_SIZE while coef >= TEN9: @@ -1120,13 +1122,17 @@ struct Decimal128( # Always emit 9 digits because there are more above. for _ in range(9): pos -= 1 - buf.unsafe_ptr()[pos] = UInt8(r32 % UInt32(10)) + ZERO_ASCII + buf.unsafe_ptr()[unsafe_offset=pos] = ( + UInt8(r32 % UInt32(10)) + ZERO_ASCII + ) r32 //= UInt32(10) var top = UInt32(coef) while top > 0: pos -= 1 - buf.unsafe_ptr()[pos] = UInt8(top % UInt32(10)) + ZERO_ASCII + buf.unsafe_ptr()[unsafe_offset=pos] = ( + UInt8(top % UInt32(10)) + ZERO_ASCII + ) top //= UInt32(10) var n_digits = BUF_SIZE - pos @@ -1138,7 +1144,8 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - unsafe_ptr=buf.unsafe_ptr() + pos, length=n_digits + unsafe_ptr=buf.unsafe_ptr().unsafe_offset(pos), + length=n_digits, ) ) ) @@ -1150,14 +1157,15 @@ struct Decimal128( # BUF_SIZE = 32, so the prefix always fits.) var zeros_count = scale - n_digits var frac_start = pos - zeros_count - var p = buf.unsafe_ptr() + frac_start + var p = buf.unsafe_ptr().unsafe_offset(frac_start) for i in range(zeros_count): - p[i] = ZERO_ASCII + p[unsafe_offset=i] = ZERO_ASCII writer.write("0.") writer.write( StringSlice( unsafe_from_utf8=Span( - unsafe_ptr=buf.unsafe_ptr() + frac_start, length=scale + unsafe_ptr=buf.unsafe_ptr().unsafe_offset(frac_start), + length=scale, ) ) ) @@ -1166,7 +1174,8 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - unsafe_ptr=buf.unsafe_ptr() + pos, length=int_len + unsafe_ptr=buf.unsafe_ptr().unsafe_offset(pos), + length=int_len, ) ) ) @@ -1174,7 +1183,9 @@ struct Decimal128( writer.write( StringSlice( unsafe_from_utf8=Span( - unsafe_ptr=buf.unsafe_ptr() + pos + int_len, + unsafe_ptr=buf.unsafe_ptr().unsafe_offset( + pos + int_len + ), length=scale, ) ) @@ -3104,21 +3115,21 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: # Locate optional leading minus (ASCII 45). var start = 0 - if n > 0 and ptr[0] == 45: + if n > 0 and ptr[unsafe_offset=0] == 45: start = 1 # Locate optional exponent suffix 'E' (ASCII 69); it bounds the # mantissa so the exponent itself is left untouched. var e_pos = n for i in range(start, n): - if ptr[i] == 69: + if ptr[unsafe_offset=i] == 69: e_pos = i break # Locate optional decimal point '.' (ASCII 46) within the mantissa. var dot_pos = -1 for i in range(start, e_pos): - if ptr[i] == 46: + if ptr[unsafe_offset=i] == 46: dot_pos = i break diff --git a/src/decimo/decimal128/utility.mojo b/src/decimo/decimal128/utility.mojo index 181b4051..fdf07628 100644 --- a/src/decimo/decimal128/utility.mojo +++ b/src/decimo/decimal128/utility.mojo @@ -22,10 +22,11 @@ low-level helpers such as bit manipulation, rounding helpers, and representation conversions. """ -from std.memory import UnsafePointer +from std.memory import Pointer from std import sys from std import time from std.bit import bit_width +from std.builtin.globals import global_constant from decimo.decimal128.decimal128 import Decimal128 from decimo.rounding_mode import RoundingMode @@ -61,7 +62,7 @@ def bitcast[dtype: DType](dec: Decimal128) -> Scalar[dtype]: ), "must be uint128 or uint256" # Bitcast the Decimal128 to the desired Mojo scalar type - var result = UnsafePointer(to=dec).bitcast[Scalar[dtype]]().load() + var result = Pointer(to=dec).unsafe_bitcast[Scalar[dtype]]().unsafe_load() # Mask out the bits in flags result &= Scalar[dtype](0xFFFFFFFF_FFFFFFFF_FFFFFFFF) return result @@ -839,6 +840,138 @@ def number_of_bits[dtype: DType, //](var value: Scalar[dtype]) -> Int: # return _power_of_10_as_uint256_cache[n] +# ===----------------------------------------------------------------------=== # +# Power-of-10 lookup tables +# +# Yuhao's notes: +# The tables are module-level `comptime` `Array`s. A `comptime` value has no +# runtime memory location, so reading one with a *runtime* index needs an +# explicit bridge into runtime code. Mojo offers three: +# +# 1. `materialize[TABLE]()[n]` - the compiler's own fix-it. It creates the +# storage *per use site*, so under `@always_inline` LLVM often rebuilds +# the whole table on the stack with immediate stores before the single +# indexed load. +# 2. A `comptime for` over the index that binds the selected entry as a +# `comptime` value and returns it immediately. The loop is unrolled at +# compile time and folds into a jump table of immediates - no memory +# traffic, but the code grows linearly with the table. +# 3. `global_constant[TABLE]()` - emits the table once into static storage +# (rodata) for the whole program and hands back a `ref` to it. One +# indexed load, no per-call-site setup, no code growth. This is the +# one to use; (1) and (2) only existed because it was not available. +# +# Measured with a standalone microbenchmark on osx-arm64. +# `global_constant` wins everywhere. +# ===----------------------------------------------------------------------=== # + + +comptime _POWER_OF_10_U128: Array[UInt128, 39] = [ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000, + 100000000000000000000, + 1000000000000000000000, + 10000000000000000000000, + 100000000000000000000000, + 1000000000000000000000000, + 10000000000000000000000000, + 100000000000000000000000000, + 1000000000000000000000000000, + 10000000000000000000000000000, + 100000000000000000000000000000, + 1000000000000000000000000000000, + 10000000000000000000000000000000, + 100000000000000000000000000000000, + 1000000000000000000000000000000000, + 10000000000000000000000000000000000, + 100000000000000000000000000000000000, + 1000000000000000000000000000000000000, + 10000000000000000000000000000000000000, + 100000000000000000000000000000000000000, +] + + +comptime _POWER_OF_10_U256: Array[UInt256, 59] = [ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000, + 100000000000000000000, + 1000000000000000000000, + 10000000000000000000000, + 100000000000000000000000, + 1000000000000000000000000, + 10000000000000000000000000, + 100000000000000000000000000, + 1000000000000000000000000000, + 10000000000000000000000000000, + 100000000000000000000000000000, + 1000000000000000000000000000000, + 10000000000000000000000000000000, + 100000000000000000000000000000000, + 1000000000000000000000000000000000, + 10000000000000000000000000000000000, + 100000000000000000000000000000000000, + 1000000000000000000000000000000000000, + 10000000000000000000000000000000000000, + 100000000000000000000000000000000000000, + 1000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000, + 100000000000000000000000000000000000000000, + 1000000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000000, + 100000000000000000000000000000000000000000000, + 1000000000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000000000, + 100000000000000000000000000000000000000000000000, + 1000000000000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000000000000, + 100000000000000000000000000000000000000000000000000, + 1000000000000000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000000000000000, + 100000000000000000000000000000000000000000000000000000, + 1000000000000000000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000000000000000000, + 100000000000000000000000000000000000000000000000000000000, + 1000000000000000000000000000000000000000000000000000000000, + 10000000000000000000000000000000000000000000000000000000000, +] + + @always_inline def power_of_10[ dtype: DType @@ -846,7 +979,7 @@ def power_of_10[ dtype == DType.uint128 or dtype == DType.uint256 ): """ - Returns 10^n via a balanced bisect if/else search. + Returns 10^n via a single indexed load from a program-lifetime table. Parameters: dtype: The Mojo scalar type to calculate the power of 10 for. @@ -863,442 +996,32 @@ def power_of_10[ Notes: **WARNING**: The bound on `n` is only checked when `debug_assert` - is enabled. Callers must guarantee `n <= 38` for `uint128` and - `n <= 58` for `uint256`. - - Implementation is a balanced binary-search if/else tree (depth - ~5 for uint128, ~6 for uint256). Each leaf returns a comptime - literal which the compiler materialises with `mov`/`movk` - immediates. No memory traffic. Does not depend on the - `comptime InlineArray` -> stack-rebuild path. + is enabled. Callers must guarantee `0 <= n <= 38` for `uint128` + and `0 <= n <= 58` for `uint256`. An out-of-range `n` reads past + the table and returns garbage in release builds. + + Implementation: `global_constant` places the table in static + read-only storage once for the whole program; the lookup is one + `adrp`/`ldr` pair, independent of table size. This replaced a + balanced bisect if/else tree of comptime literals, which was + ~18x slower for `uint128` and ~23x slower for `uint256`. See the + notes above the tables. """ comptime if dtype == DType.uint128: # 10^38 ~= 1e38 < 2^128 ~= 3.4e38, so 10^38 is the largest power # of 10 representable in UInt128. - debug_assert(n <= 38, "power_of_10[uint128]: n must be <= 38") - if n < 14: - if n < 7: - if n < 3: - if n < 1: - return 1 - else: - if n == 1: - return 10 - else: - return 100 - else: - if n < 5: - if n == 3: - return 1000 - else: - return 10000 - else: - if n == 5: - return 100000 - else: - return 1000000 - else: - if n < 10: - if n < 8: - return 10000000 - else: - if n == 8: - return 100000000 - else: - return 1000000000 - else: - if n < 12: - if n == 10: - return 10000000000 - else: - return 100000000000 - else: - if n == 12: - return 1000000000000 - else: - return 10000000000000 - else: - if n < 21: - if n < 17: - if n < 15: - return 100000000000000 - else: - if n == 15: - return 1000000000000000 - else: - return 10000000000000000 - else: - if n < 19: - if n == 17: - return 100000000000000000 - else: - return 1000000000000000000 - else: - if n == 19: - return 10000000000000000000 - else: - return 100000000000000000000 - else: - if n < 29: - if n < 25: - if n < 23: - if n == 21: - return 1000000000000000000000 - else: - return 10000000000000000000000 - else: - if n == 23: - return 100000000000000000000000 - else: - return 1000000000000000000000000 - else: - if n < 27: - if n == 25: - return 10000000000000000000000000 - else: - return 100000000000000000000000000 - else: - if n == 27: - return 1000000000000000000000000000 - else: - return 10000000000000000000000000000 - else: - # n in 29..38 - if n < 33: - if n < 31: - if n == 29: - return 100000000000000000000000000000 - else: - return 1000000000000000000000000000000 - else: - if n == 31: - return 10000000000000000000000000000000 - else: - return 100000000000000000000000000000000 - else: - if n < 36: - if n < 34: - return 1000000000000000000000000000000000 - else: - if n == 34: - return 10000000000000000000000000000000000 - else: - return 100000000000000000000000000000000000 - else: - if n < 38: - if n == 36: - return 1000000000000000000000000000000000000 - else: - return ( - 10000000000000000000000000000000000000 - ) - else: - return 100000000000000000000000000000000000000 + debug_assert( + n >= 0 and n <= 38, "power_of_10[uint128]: n must be in 0..38" + ) + ref table = global_constant[_POWER_OF_10_U128]() + return rebind[Scalar[dtype]](table[n]) else: - debug_assert(n <= 58, "power_of_10[uint256]: n must be <= 58") - if n < 29: - if n < 14: - if n < 7: - if n < 3: - if n < 1: - return 1 - else: - if n == 1: - return 10 - else: - return 100 - else: - if n < 5: - if n == 3: - return 1000 - else: - return 10000 - else: - if n == 5: - return 100000 - else: - return 1000000 - else: - if n < 10: - if n < 8: - return 10000000 - else: - if n == 8: - return 100000000 - else: - return 1000000000 - else: - if n < 12: - if n == 10: - return 10000000000 - else: - return 100000000000 - else: - if n == 12: - return 1000000000000 - else: - return 10000000000000 - else: - if n < 21: - if n < 17: - if n < 15: - return 100000000000000 - else: - if n == 15: - return 1000000000000000 - else: - return 10000000000000000 - else: - if n < 19: - if n == 17: - return 100000000000000000 - else: - return 1000000000000000000 - else: - if n == 19: - return 10000000000000000000 - else: - return 100000000000000000000 - else: - if n < 25: - if n < 23: - if n == 21: - return 1000000000000000000000 - else: - return 10000000000000000000000 - else: - if n == 23: - return 100000000000000000000000 - else: - return 1000000000000000000000000 - else: - if n < 27: - if n == 25: - return 10000000000000000000000000 - else: - return 100000000000000000000000000 - else: - if n == 27: - return 1000000000000000000000000000 - else: - return 10000000000000000000000000000 - else: - if n < 44: - if n < 36: - if n < 32: - if n < 30: - return 100000000000000000000000000000 - else: - if n == 30: - return 1000000000000000000000000000000 - else: - return 10000000000000000000000000000000 - else: - if n < 34: - if n == 32: - return 100000000000000000000000000000000 - else: - return 1000000000000000000000000000000000 - else: - if n == 34: - return 10000000000000000000000000000000000 - else: - return 100000000000000000000000000000000000 - else: - if n < 40: - if n < 38: - if n == 36: - return 1000000000000000000000000000000000000 - else: - return 10000000000000000000000000000000000000 - else: - if n == 38: - return 100000000000000000000000000000000000000 - else: - return 1000000000000000000000000000000000000000 - else: - if n < 42: - if n == 40: - return 10000000000000000000000000000000000000000 - else: - return ( - 100000000000000000000000000000000000000000 - ) - else: - if n == 42: - return ( - 1000000000000000000000000000000000000000000 - ) - else: - return ( - 10000000000000000000000000000000000000000000 - ) - else: - if n < 51: - if n < 47: - if n < 45: - return 100000000000000000000000000000000000000000000 - else: - if n == 45: - return 1000000000000000000000000000000000000000000000 - else: - return 10000000000000000000000000000000000000000000000 - else: - if n < 49: - if n == 47: - return 100000000000000000000000000000000000000000000000 - else: - return 1000000000000000000000000000000000000000000000000 - else: - if n == 49: - return 10000000000000000000000000000000000000000000000000 - else: - return 100000000000000000000000000000000000000000000000000 - else: - if n < 55: - if n < 53: - if n == 51: - return 1000000000000000000000000000000000000000000000000000 - else: - return 10000000000000000000000000000000000000000000000000000 - else: - if n == 53: - return 100000000000000000000000000000000000000000000000000000 - else: - return 1000000000000000000000000000000000000000000000000000000 - else: - if n < 57: - if n == 55: - return 10000000000000000000000000000000000000000000000000000000 - else: - return 100000000000000000000000000000000000000000000000000000000 - else: - if n == 57: - return 1000000000000000000000000000000000000000000000000000000000 - else: - return 10000000000000000000000000000000000000000000000000000000000 - - -# ===----------------------------------------------------------------------=== # -# `power_of_10_unsafe` - high-performance variant using string-literal rodata -# -# Yuhao's notes: -# Each entry is laid out as a contiguous little-endian byte sequence inside a -# `StringLiteral`. `StringLiteral.unsafe_ptr().bitcast[Scalar[dtype]]()[n]` -# yields the n-th power of 10 with a single indexed load - no stack -# materialisation, no per-call-site `comptime InlineArray` rebuild. -# -# Why not just use this in `power_of_10`? Because the bitcast trick is a -# workaround for Mojo's lack of module-level cached variables; it is not -# elegant Mojo. When Mojo grows real module-level variables, this entire -# section can be replaced with a single shared `var POWER_OF_10_U128 = -# InlineArray[UInt128, 29](...)` and `power_of_10` can call into it -# directly. Until then, hot paths that need every nanosecond use -# `power_of_10_unsafe`; the public `power_of_10` keeps the elegant -# bisect implementation. -# -# Total rodata cost: 30 * 16 + 59 * 32 = 2 368 bytes. -# ===----------------------------------------------------------------------=== # - - -comptime _POWER_OF_10_U128 = InlineArray[UInt128, 30]( - UInt128(1), - UInt128(10), - UInt128(100), - UInt128(1000), - UInt128(10000), - UInt128(100000), - UInt128(1000000), - UInt128(10000000), - UInt128(100000000), - UInt128(1000000000), - UInt128(10000000000), - UInt128(100000000000), - UInt128(1000000000000), - UInt128(10000000000000), - UInt128(100000000000000), - UInt128(1000000000000000), - UInt128(10000000000000000), - UInt128(100000000000000000), - UInt128(1000000000000000000), - UInt128(10000000000000000000), - UInt128(100000000000000000000), - UInt128(1000000000000000000000), - UInt128(10000000000000000000000), - UInt128(100000000000000000000000), - UInt128(1000000000000000000000000), - UInt128(10000000000000000000000000), - UInt128(100000000000000000000000000), - UInt128(1000000000000000000000000000), - UInt128(10000000000000000000000000000), - UInt128(100000000000000000000000000000), - __list_literal__=None, -) - - -comptime _POWER_OF_10_U256 = InlineArray[UInt256, 59]( - UInt256(1), - UInt256(10), - UInt256(100), - UInt256(1000), - UInt256(10000), - UInt256(100000), - UInt256(1000000), - UInt256(10000000), - UInt256(100000000), - UInt256(1000000000), - UInt256(10000000000), - UInt256(100000000000), - UInt256(1000000000000), - UInt256(10000000000000), - UInt256(100000000000000), - UInt256(1000000000000000), - UInt256(10000000000000000), - UInt256(100000000000000000), - UInt256(1000000000000000000), - UInt256(10000000000000000000), - UInt256(100000000000000000000), - UInt256(1000000000000000000000), - UInt256(10000000000000000000000), - UInt256(100000000000000000000000), - UInt256(1000000000000000000000000), - UInt256(10000000000000000000000000), - UInt256(100000000000000000000000000), - UInt256(1000000000000000000000000000), - UInt256(10000000000000000000000000000), - UInt256(100000000000000000000000000000), - UInt256(1000000000000000000000000000000), - UInt256(10000000000000000000000000000000), - UInt256(100000000000000000000000000000000), - UInt256(1000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000000000000000000), - UInt256(100000000000000000000000000000000000000000000000000000000), - UInt256(1000000000000000000000000000000000000000000000000000000000), - UInt256(10000000000000000000000000000000000000000000000000000000000), - __list_literal__=None, -) + debug_assert( + n >= 0 and n <= 58, "power_of_10[uint256]: n must be in 0..58" + ) + ref table = global_constant[_POWER_OF_10_U256]() + return rebind[Scalar[dtype]](table[n]) @always_inline @@ -1308,7 +1031,7 @@ def power_of_10_unsafe[ dtype == DType.uint128 or dtype == DType.uint256 ): """ - Returns 10^n via a single indexed load from a comptime InlineArray table. + Returns 10^n via a single indexed load, with a narrower documented range. Parameters: dtype: The Mojo scalar type to calculate the power of 10 for. Must be @@ -1326,30 +1049,29 @@ def power_of_10_unsafe[ Notes: **WARNING**: This function performs **no runtime bounds check** in - release builds (`-D ASSERT=none`). Out-of-range `n` will index - past the end of the table and return arbitrary bits. Callers must - guarantee `0 <= n <= 29` for `uint128` and `0 <= n <= 58` for - `uint256`. A `debug_assert` catches violations in debug builds - (`-D ASSERT=all`); use `power_of_10` (asserted, raises) when you - cannot prove `n` is in range. - - Implementation: the entries live in module-level `comptime` - `InlineArray` tables (`_POWER_OF_10_U128`, `_POWER_OF_10_U256`) - materialised once at compile time. Indexing into a `comptime` - InlineArray compiles to a single load from rodata; no stack - materialisation, no allocation, no per-call-site rebuild. The - `rebind[Scalar[dtype]]` is a zero-cost type bridge from the - table's concrete element type (`UInt128`/`UInt256`) to the - caller-requested `Scalar[dtype]`. + release builds (`-D ASSERT=none`). Callers must guarantee + `0 <= n <= 29` for `uint128` and `0 <= n <= 58` for `uint256`. A + `debug_assert` catches violations in debug builds + (`-D ASSERT=all`). An out-of-range `n` reads past the table and + returns garbage; earlier revisions returned `0`, which was never + a contract - do not rely on either. + + This is now the same single indexed load as `power_of_10`; the + two differ only in the documented range they assert (`0..29` here + versus `0..38` there for `uint128`). The stricter assert is kept + because most `Decimal128` call sites can prove `n <= 29` and want + the tighter debug-build check. The historical performance gap + between the two is gone - both compile to the same single load. Migration note: this used to read from a packed `StringLiteral` rodata blob via `unsafe_ptr().bitcast[Scalar[dtype]]().load[ alignment=1](n)`. Mojo 1.0.0b1 changed `StringLiteral` to always-UTF-8-encode arbitrary byte literals (e.g. `\\x9a` became - the 2-byte sequence `[0xC2, 0x9A]`), corrupting the blob. The - `comptime InlineArray` approach is both safer (no manual byte - layout) and the elegant target form once Mojo gets full - module-level variable support. + the 2-byte sequence `[0xC2, 0x9A]`), corrupting the blob. Mojo + 1.1 then renamed `InlineArray` to `Array` and dropped its + `ImplicitlyCopyable` conformance, forcing a `materialize` / + `comptime for` workaround until `global_constant` arrived and + restored the original single-load-from-rodata behaviour. """ comptime if dtype == DType.uint128: @@ -1361,13 +1083,15 @@ def power_of_10_unsafe[ n >= 0 and n <= 29, "power_of_10_unsafe[uint128]: n out of range, must be 0..29", ) - return rebind[Scalar[dtype]](_POWER_OF_10_U128[n]) + ref table = global_constant[_POWER_OF_10_U128]() + return rebind[Scalar[dtype]](table[n]) else: debug_assert( n >= 0 and n <= 58, "power_of_10_unsafe[uint256]: n out of range, must be 0..58", ) - return rebind[Scalar[dtype]](_POWER_OF_10_U256[n]) + ref table = global_constant[_POWER_OF_10_U256]() + return rebind[Scalar[dtype]](table[n]) # ===----------------------------------------------------------------------=== # @@ -1448,134 +1172,74 @@ def _mulhi_u256(a: UInt256, b: UInt256) -> UInt256: # m = -((-(1 << (N+ell))) // d) # ceil # mp = m - (1 << N) # blob.extend(mp.to_bytes(32, "little")) -comptime _GM_RECIPROCAL = InlineArray[UInt256, 30]( - UInt256(0), # k=0 unused - UInt256( - 69475253542389717254142591005212744711961990799384338423674550404747877783962 - ), # k=1 - UInt256( - 32421784986448534718599875802432614198915595706379357931048123522215676299183 - ), # k=2 - UInt256( - 2779010141695588690165703640208509788478479631975373536946982016189915111359 - ), # k=3 - UInt256( - 73921669769102659158407716829546360373527558210544936082789721630651741962136 - ), # k=4 - UInt256( - 35978917967818888242011976461899506728168049635307836058340260502938767641721 - ), # k=5 - UInt256( - 5624716526791871508895384167782023811880442775118156038780691600768388185390 - ), # k=6 - UInt256( - 78474799985256711668375205673663982810970699239573388085723656965977298880585 - ), # k=7 - UInt256( - 39621422140742130249985967537193604678122562458530597660687408771199213176481 - ), # k=8 - UInt256( - 8538719865130465115274577028017302171844053033696365320658410215376744613198 - ), # k=9 - UInt256( - 83137205326598461438581914250040428186912475653298522936728006749350669165078 - ), # k=10 - UInt256( - 43351346413815530066151334398294760978875983589510705541490888597897909404075 - ), # k=11 - UInt256( - 11522659283589184968206870516898227212446789938480451625301194076735701595273 - ), # k=12 - UInt256( - 87911508396132413203273583832249908251876854700953061024156460927525000336398 - ), # k=13 - UInt256( - 47170788869442691477904670064062345030847486827634336011433651940437374341131 - ), # k=14 - UInt256( - 14578213248090914097609539049512294454023992528979356001255404750767273544918 - ), # k=15 - UInt256( - 92800394739335179810317853484432415838400378845751308025683198005975515455830 - ), # k=16 - UInt256( - 51081897944004904763540085785808351100066306143472933612655041603197786436677 - ), # k=17 - UInt256( - 17707100507740684726117871626909099309399047981650234082232516480975603221355 - ), # k=18 - UInt256( - 97806614354774812815931185608267303607000467570024712955246576774308842938129 - ), # k=19 - UInt256( - 55086873636356611168030751484876261314946377122891657556305744617864448422516 - ), # k=20 - UInt256( - 20911081061622049849710404186163427481303104765185213237153078892708932810025 - ), # k=21 - UInt256( - 102932983240984997013679237703074228682046958423680679603119476633082170280002 - ), # k=22 - UInt256( - 59187968745324758526229193160721801374983569805816430874604064504883110296015 - ), # k=23 - UInt256( - 24191957148796567736269157526839859529332858911525031891791734802323862308825 - ), # k=24 - UInt256( - 108182384980464225632173243048156519958894565057824389450541326088466057478081 - ), # k=25 - UInt256( - 63387490136908141421024397436787634396461655113131398752541544069190220054477 - ), # k=26 - UInt256( - 27551574262063274052105320947692525946515327157377006194141718453769550115595 - ), # k=27 - UInt256( - 113557772361690955737511104521520786226386514251187548334301299930779157968913 - ), # k=28 - UInt256( - 67687800041889525505294686615479047410455214467821925859549523143040700447143 - ), # k=29 - __list_literal__=None, -) +comptime _GM_RECIPROCAL: Array[UInt256, 30] = [ + 0, # k=0 unused + 69475253542389717254142591005212744711961990799384338423674550404747877783962, # k=1 + 32421784986448534718599875802432614198915595706379357931048123522215676299183, # k=2 + 2779010141695588690165703640208509788478479631975373536946982016189915111359, # k=3 + 73921669769102659158407716829546360373527558210544936082789721630651741962136, # k=4 + 35978917967818888242011976461899506728168049635307836058340260502938767641721, # k=5 + 5624716526791871508895384167782023811880442775118156038780691600768388185390, # k=6 + 78474799985256711668375205673663982810970699239573388085723656965977298880585, # k=7 + 39621422140742130249985967537193604678122562458530597660687408771199213176481, # k=8 + 8538719865130465115274577028017302171844053033696365320658410215376744613198, # k=9 + 83137205326598461438581914250040428186912475653298522936728006749350669165078, # k=10 + 43351346413815530066151334398294760978875983589510705541490888597897909404075, # k=11 + 11522659283589184968206870516898227212446789938480451625301194076735701595273, # k=12 + 87911508396132413203273583832249908251876854700953061024156460927525000336398, # k=13 + 47170788869442691477904670064062345030847486827634336011433651940437374341131, # k=14 + 14578213248090914097609539049512294454023992528979356001255404750767273544918, # k=15 + 92800394739335179810317853484432415838400378845751308025683198005975515455830, # k=16 + 51081897944004904763540085785808351100066306143472933612655041603197786436677, # k=17 + 17707100507740684726117871626909099309399047981650234082232516480975603221355, # k=18 + 97806614354774812815931185608267303607000467570024712955246576774308842938129, # k=19 + 55086873636356611168030751484876261314946377122891657556305744617864448422516, # k=20 + 20911081061622049849710404186163427481303104765185213237153078892708932810025, # k=21 + 102932983240984997013679237703074228682046958423680679603119476633082170280002, # k=22 + 59187968745324758526229193160721801374983569805816430874604064504883110296015, # k=23 + 24191957148796567736269157526839859529332858911525031891791734802323862308825, # k=24 + 108182384980464225632173243048156519958894565057824389450541326088466057478081, # k=25 + 63387490136908141421024397436787634396461655113131398752541544069190220054477, # k=26 + 27551574262063274052105320947692525946515327157377006194141718453769550115595, # k=27 + 113557772361690955737511104521520786226386514251187548334301299930779157968913, # k=28 + 67687800041889525505294686615479047410455214467821925859549523143040700447143, # k=29 +] # Per-`k` shift amount (`ell - 1`), 30 entries (index 0 unused). # Same offline generation; max value is 96 (k=29), comfortably ≤ 255. -comptime _GM_SHIFT = InlineArray[UInt8, 30]( - UInt8(0), # k=0 unused - UInt8(3), # k=1 - UInt8(6), # k=2 - UInt8(9), # k=3 - UInt8(13), # k=4 - UInt8(16), # k=5 - UInt8(19), # k=6 - UInt8(23), # k=7 - UInt8(26), # k=8 - UInt8(29), # k=9 - UInt8(33), # k=10 - UInt8(36), # k=11 - UInt8(39), # k=12 - UInt8(43), # k=13 - UInt8(46), # k=14 - UInt8(49), # k=15 - UInt8(53), # k=16 - UInt8(56), # k=17 - UInt8(59), # k=18 - UInt8(63), # k=19 - UInt8(66), # k=20 - UInt8(69), # k=21 - UInt8(73), # k=22 - UInt8(76), # k=23 - UInt8(79), # k=24 - UInt8(83), # k=25 - UInt8(86), # k=26 - UInt8(89), # k=27 - UInt8(93), # k=28 - UInt8(96), # k=29 - __list_literal__=None, -) +comptime _GM_SHIFT: Array[UInt8, 30] = [ + 0, # k=0 unused + 3, # k=1 + 6, # k=2 + 9, # k=3 + 13, # k=4 + 16, # k=5 + 19, # k=6 + 23, # k=7 + 26, # k=8 + 29, # k=9 + 33, # k=10 + 36, # k=11 + 39, # k=12 + 43, # k=13 + 46, # k=14 + 49, # k=15 + 53, # k=16 + 56, # k=17 + 59, # k=18 + 63, # k=19 + 66, # k=20 + 69, # k=21 + 73, # k=22 + 76, # k=23 + 79, # k=24 + 83, # k=25 + 86, # k=26 + 89, # k=27 + 93, # k=28 + 96, # k=29 +] @always_inline @@ -1602,14 +1266,19 @@ def udiv_u256_by_pow10_gm(value: UInt256, k: Int) -> UInt256: Algorithm: Granlund-Möller saturating reciprocal (Hacker's Delight §10-9). The 256-bit reciprocal `m'` and shift amount `ell - 1` for each `d = 10^k` are precomputed in the - `_GM_RECIPROCAL_BLOB` and `_GM_SHIFT_BLOB` rodata blobs. + `_GM_RECIPROCAL` and `_GM_SHIFT` tables, which + `global_constant` places in program-lifetime rodata. """ - # Direct InlineArray load (Mojo 1.0.0b1: StringLiteral now UTF-8 - # encodes `\xNN` escapes for `NN >= 0x80`, which corrupted the old - # rodata blob layout; module-level `comptime InlineArray` is now - # supported and provides the same single-load semantics). - var mp = _GM_RECIPROCAL[k] - var shift = Int(_GM_SHIFT[k]) + # `global_constant` emits each table once into program-lifetime rodata + # and hands back a `ref`, so this is two indexed loads with no + # per-call-site setup. `materialize` rebuilt the 30 x UInt256 + # reciprocal table on the stack at every inlined site: 19.05 ns/call + # for the whole divider versus 3.93 ns here (osx-arm64, release + # build). See the notes above the power-of-10 tables. + ref reciprocals = global_constant[_GM_RECIPROCAL]() + ref shifts = global_constant[_GM_SHIFT]() + var mp = reciprocals[k] + var shift = Int(shifts[k]) var t1 = _mulhi_u256(mp, value) var t = ((value - t1) >> 1) + t1 return t >> UInt256(shift) diff --git a/src/decimo/expression/tokenizer.mojo b/src/decimo/expression/tokenizer.mojo index a8e043f9..1d565c99 100644 --- a/src/decimo/expression/tokenizer.mojo +++ b/src/decimo/expression/tokenizer.mojo @@ -94,15 +94,15 @@ struct Token(Copyable, ImplicitlyCopyable, Movable): self.value = copy.value self.position = copy.position - def __init__(out self, *, deinit take: Self): + def __init__(out self, *, deinit move: Self): """Move-constructs a Token. Args: - take: The token to move from. + move: The token to move from. """ - self.kind = take.kind - self.value = take.value^ - self.position = take.position + self.kind = move.kind + self.value = move.value^ + self.position = move.position def is_operator(self) -> Bool: """Returns True if this token is a binary or unary operator. @@ -267,7 +267,7 @@ def tokenize( var i = 0 while i < n: - var c = ptr[i] + var c = ptr[unsafe_offset=i] # Skip whitespace (space, tab, newline, carriage return) if c == 32 or c == 9 or c == 10 or c == 13: @@ -280,7 +280,7 @@ def tokenize( var has_dot = c == 46 i += 1 while i < n: - var cc = ptr[i] + var cc = ptr[unsafe_offset=i] if cc >= 48 and cc <= 57: i += 1 elif cc == 46 and not has_dot: @@ -291,7 +291,7 @@ def tokenize( # Build the number string from the byte range var num_bytes = List[UInt8](capacity=i - start) for j in range(start, i): - num_bytes.append(ptr[j]) + num_bytes.append(ptr[unsafe_offset=j]) tokens.append( Token( TOKEN_NUMBER, @@ -305,11 +305,11 @@ def tokenize( if is_alpha_or_underscore(c): var start = i i += 1 - while i < n and is_alnum_or_underscore(ptr[i]): + while i < n and is_alnum_or_underscore(ptr[unsafe_offset=i]): i += 1 var id_bytes = List[UInt8](capacity=i - start) for j in range(start, i): - id_bytes.append(ptr[j]) + id_bytes.append(ptr[unsafe_offset=j]) var name = String(unsafe_from_utf8=id_bytes^) # Check if it is a known constant @@ -367,7 +367,7 @@ def tokenize( if c == 42: # '*' # Support '**' as an alias for '^' - if i + 1 < n and ptr[i + 1] == 42: + if i + 1 < n and ptr[unsafe_offset=i + 1] == 42: tokens.append(Token(TOKEN_CARET, "^", position=i)) i += 2 else: diff --git a/src/decimo/numerals/chinese.mojo b/src/decimo/numerals/chinese.mojo index bbd70752..022d4aee 100644 --- a/src/decimo/numerals/chinese.mojo +++ b/src/decimo/numerals/chinese.mojo @@ -146,10 +146,10 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): ``` """ - var digits: InlineArray[StaticString, 10] + var digits: Array[StaticString, 10] """The words for the digits 0 to 9, e.g. 零一二三四五六七八九. Entry 0 doubles as the zero-filler word inserted between groups.""" - var units: InlineArray[StaticString, 3] + var units: Array[StaticString, 3] """The intra-group units in ascending order: 十, 百, 千.""" var wan: StaticString """The 10^4 word (万 / 萬).""" @@ -167,8 +167,8 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): def __init__( out self, - digits: InlineArray[StaticString, 10], - units: InlineArray[StaticString, 3], + digits: Array[StaticString, 10], + units: Array[StaticString, 3], wan: StaticString, yi: StaticString, point: StaticString, @@ -186,14 +186,34 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): negative_sign: The negative-sign word. simplify_leading_ten: Whether a leading 一十 becomes 十. """ - self.digits = digits - self.units = units + self.digits = digits.copy() + self.units = units.copy() self.wan = wan self.yi = yi self.point = point self.negative_sign = negative_sign self.simplify_leading_ten = simplify_leading_ten + def __init__(out self, *, copy: Self): + """Copies a numeral style. + + Args: + copy: The style to copy from. + + Notes: + + Mojo 1.1 dropped `Array`'s `ImplicitlyCopyable` conformance, so a + struct holding one can no longer synthesise its implicit copy + constructor. Writing it out by hand restores the conformance. + """ + self.digits = copy.digits.copy() + self.units = copy.units.copy() + self.wan = copy.wan + self.yi = copy.yi + self.point = copy.point + self.negative_sign = copy.negative_sign + self.simplify_leading_ten = copy.simplify_leading_ten + @staticmethod def simplified() -> Self: """Returns the everyday simplified-Chinese style (一二三 / 万亿 / 点). @@ -201,7 +221,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): Returns: The 简体小写 numeral style. """ - var digits: InlineArray[StaticString, 10] = [ + var digits: Array[StaticString, 10] = [ "零", "一", "二", @@ -213,7 +233,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): "八", "九", ] - var units: InlineArray[StaticString, 3] = ["十", "百", "千"] + var units: Array[StaticString, 3] = ["十", "百", "千"] return Self(digits, units, "万", "亿", "点", "负", True) @staticmethod @@ -225,7 +245,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): Returns: The 简体大写 numeral style. """ - var digits: InlineArray[StaticString, 10] = [ + var digits: Array[StaticString, 10] = [ "零", "壹", "贰", @@ -237,7 +257,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): "捌", "玖", ] - var units: InlineArray[StaticString, 3] = ["拾", "佰", "仟"] + var units: Array[StaticString, 3] = ["拾", "佰", "仟"] return Self(digits, units, "万", "亿", "点", "负", False) @staticmethod @@ -247,7 +267,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): Returns: The 繁體小寫 numeral style. """ - var digits: InlineArray[StaticString, 10] = [ + var digits: Array[StaticString, 10] = [ "零", "一", "二", @@ -259,7 +279,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): "八", "九", ] - var units: InlineArray[StaticString, 3] = ["十", "百", "千"] + var units: Array[StaticString, 3] = ["十", "百", "千"] return Self(digits, units, "萬", "億", "點", "負", True) @staticmethod @@ -269,7 +289,7 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): Returns: The 繁體大寫 numeral style. """ - var digits: InlineArray[StaticString, 10] = [ + var digits: Array[StaticString, 10] = [ "零", "壹", "貳", @@ -281,12 +301,12 @@ struct ChineseNumeralStyle(Copyable, ImplicitlyCopyable, Movable): "捌", "玖", ] - var units: InlineArray[StaticString, 3] = ["拾", "佰", "仟"] + var units: Array[StaticString, 3] = ["拾", "佰", "仟"] return Self(digits, units, "萬", "億", "點", "負", False) def _chinese_group_to_string( - group: InlineArray[UInt8, 4], style: ChineseNumeralStyle + group: Array[UInt8, 4], style: ChineseNumeralStyle ) -> String: """Reads one group of four digits (0..9999) with the 十/百/千 units. @@ -324,7 +344,7 @@ def _chinese_group_to_string( def _chinese_section_to_string( - section: InlineArray[UInt8, 8], style: ChineseNumeralStyle + section: Array[UInt8, 8], style: ChineseNumeralStyle ) -> String: """Reads one section of eight digits (0..99999999) with 十/百/千 and 万. @@ -341,8 +361,8 @@ def _chinese_section_to_string( Returns: The reading of the section, e.g. `4560_0007` -> 四千五百六十万零七. """ - var upper = InlineArray[UInt8, 4](fill=0) - var lower = InlineArray[UInt8, 4](fill=0) + var upper = Array[UInt8, 4](fill=0) + var lower = Array[UInt8, 4](fill=0) var upper_is_zero = True var lower_is_zero = True @@ -399,7 +419,7 @@ def _integer_digits_to_chinese( var pending_zero = False for section_index in range(num_sections): - var section = InlineArray[UInt8, 8](fill=0) + var section = Array[UInt8, 8](fill=0) var is_zero_section = True for i in range(8): var position = section_index * 8 + i - padding @@ -439,7 +459,8 @@ def _integer_digits_to_chinese( if style.simplify_leading_ten: var leading_ten = String(style.digits[1]) + style.units[0] if result.startswith(leading_ten): - result = String(result[byte = style.digits[1].byte_length() :]) + var trimmed = String(result[byte = style.digits[1].byte_length() :]) + result = trimmed^ return result^ @@ -491,7 +512,7 @@ def decimal_string_to_chinese( """ var parsed = parse_numeric_string(value) - var ref coefficient: List[UInt8] = parsed[0] + ref coefficient = parsed[0] var scale: Int = parsed[1] var sign: Bool = parsed[2] var num_digits = len(coefficient) diff --git a/src/decimo/rational/rational.mojo b/src/decimo/rational/rational.mojo index f023136b..afb13c2d 100644 --- a/src/decimo/rational/rational.mojo +++ b/src/decimo/rational/rational.mojo @@ -236,7 +236,7 @@ struct Rational( Returns: The string representation. """ - return String.write(self) + return String(self) @no_inline def __repr__(self) -> String: diff --git a/src/decimo/str.mojo b/src/decimo/str.mojo index 3b8f38fb..5345ef1f 100644 --- a/src/decimo/str.mojo +++ b/src/decimo/str.mojo @@ -200,7 +200,7 @@ def parse_numeric_string( var last_was_separator: Bool = False for i in range(n): - var c = ptr[i] + var c = ptr[unsafe_offset=i] # Check digits first (most common case for performance) if c >= 48 and c <= 57: # '0'-'9' @@ -334,7 +334,7 @@ def parse_numeric_string( if exponent_pos != -1: for i in range(exponent_pos + 1, n): - var c = ptr[i] + var c = ptr[unsafe_offset=i] if c >= 48 and c <= 57: raw_exponent = raw_exponent * 10 + Int(c - 48) elif c == 45: @@ -405,9 +405,9 @@ def parse_numeric_string( def convert_fast[ simd_width: Int ](i: Int) {mut coef, imm value_bytes, imm extract_start}: - coef.unsafe_ptr().store[width=simd_width]( + coef.unsafe_ptr().unsafe_store[width=simd_width]( i, - value_bytes.unsafe_ptr().load[width=simd_width]( + value_bytes.unsafe_ptr().unsafe_load[width=simd_width]( extract_start + i ) - SIMD[DType.uint8, simd_width](48), @@ -428,9 +428,9 @@ def parse_numeric_string( def convert_before[ simd_width: Int ](i: Int) {mut coef, imm value_bytes, imm extract_start}: - coef.unsafe_ptr().store[width=simd_width]( + coef.unsafe_ptr().unsafe_store[width=simd_width]( i, - value_bytes.unsafe_ptr().load[width=simd_width]( + value_bytes.unsafe_ptr().unsafe_load[width=simd_width]( extract_start + i ) - SIMD[DType.uint8, simd_width](48), @@ -449,9 +449,9 @@ def parse_numeric_string( imm decimal_point_pos, imm before_count, }: - coef.unsafe_ptr().store[width=simd_width]( + coef.unsafe_ptr().unsafe_store[width=simd_width]( before_count + i, - value_bytes.unsafe_ptr().load[width=simd_width]( + value_bytes.unsafe_ptr().unsafe_load[width=simd_width]( decimal_point_pos + 1 + i ) - SIMD[DType.uint8, simd_width](48), @@ -464,7 +464,7 @@ def parse_numeric_string( # Separators (commas, underscores, spaces) present in the range. # Extract digit bytes one by one. for i in range(extract_start, extract_end): - var c = ptr[i] + var c = ptr[unsafe_offset=i] if c >= 48 and c <= 57: coef.append(c - 48) diff --git a/src/decimo/tests.mojo b/src/decimo/tests.mojo index 7855d1ab..0dd3116c 100644 --- a/src/decimo/tests.mojo +++ b/src/decimo/tests.mojo @@ -111,16 +111,16 @@ struct TestCase(Copyable, Movable, Writable): self.expected = copy.expected self.description = copy.description - def __init__(out self, *, deinit take: Self): + def __init__(out self, *, deinit move: Self): """Moves a `TestCase` into a new instance. Args: - take: The instance to move from. + move: The instance to move from. """ - self.a = take.a^ - self.b = take.b^ - self.expected = take.expected^ - self.description = take.description^ + self.a = move.a^ + self.b = move.b^ + self.expected = move.expected^ + self.description = move.description^ def write_to[T: Writer](self, mut writer: T): """Writes a formatted representation of the test case to a writer. @@ -183,16 +183,16 @@ struct BenchCase(Copyable, Movable, Writable): self.b = copy.b self.c = copy.c - def __init__(out self, *, deinit take: Self): + def __init__(out self, *, deinit move: Self): """Moves a `BenchCase` into a new instance. Args: - take: The instance to move from. + move: The instance to move from. """ - self.name = take.name^ - self.a = take.a^ - self.b = take.b^ - self.c = take.c^ + self.name = move.name^ + self.a = move.a^ + self.b = move.b^ + self.c = move.c^ def write_to[T: Writer](self, mut writer: T): """Writes a formatted representation of the benchmark case to a writer. @@ -491,14 +491,14 @@ struct PrecisionLevel(Copyable, Movable): self.precision = copy.precision self.iterations = copy.iterations - def __init__(out self, *, deinit take: Self): + def __init__(out self, *, deinit move: Self): """Moves a `PrecisionLevel` into a new instance. Args: - take: The instance to move from. + move: The instance to move from. """ - self.precision = take.precision - self.iterations = take.iterations + self.precision = move.precision + self.iterations = move.iterations def load_bench_precision_levels( diff --git a/src/decimo/toml/parser.mojo b/src/decimo/toml/parser.mojo index 1c887849..d9fe2402 100644 --- a/src/decimo/toml/parser.mojo +++ b/src/decimo/toml/parser.mojo @@ -34,7 +34,7 @@ from decimo.errors import ValueError from .tokenizer import Token, TokenType, Tokenizer -struct TOMLValue(Copyable, ImplicitlyDeletable, Movable): +struct TOMLValue(Copyable, Deinitable, Movable): """Represents a value in the TOML document.""" var type: TOMLValueType @@ -132,7 +132,7 @@ struct TOMLValue(Copyable, ImplicitlyDeletable, Movable): self.array_values = copy.array_values.copy() self.table_values = copy.table_values.copy() - def __del__(deinit self): + def __deinit__(deinit self): """Destructor to clean up resources.""" self.array_values.clear() self.table_values.clear() @@ -1080,6 +1080,7 @@ def parse_file(file_path: String) raises -> TOMLDocument: explicitly detected. """ + var content: String with open(file_path, "r") as file: content = file.read() diff --git a/src/decimo/toml/tokenizer.mojo b/src/decimo/toml/tokenizer.mojo index c2abcb08..669fe282 100644 --- a/src/decimo/toml/tokenizer.mojo +++ b/src/decimo/toml/tokenizer.mojo @@ -410,9 +410,9 @@ struct Tokenizer: - Multi-line basic strings (triple double quotes) - Multi-line literal strings (triple single quotes) """ - start_line = self.position.line - start_column = self.position.column - quote_char = self.current_char + var start_line = self.position.line + var start_column = self.position.column + var quote_char = self.current_char # Check for multi-line string (triple quotes) var is_multiline = False @@ -599,8 +599,8 @@ struct Tokenizer: - Scientific notation: 1e10, 1.5e-3, 6.022E+23 - Float: 3.14 """ - start_line = self.position.line - start_column = self.position.column + var start_line = self.position.line + var start_column = self.position.column var result = sign var is_float = False @@ -682,9 +682,9 @@ struct Tokenizer: def _read_key(mut self) -> Token: """Read a key identifier.""" - start_line = self.position.line - start_column = self.position.column - result = String("") + var start_line = self.position.line + var start_column = self.position.column + var result = String("") while self.current_char and ( self.current_char.is_ascii_digit() @@ -719,7 +719,7 @@ struct Tokenizer: if self.current_char == "\r": # Check for CRLF if self._get_char(self.position.index + 1) == "\n": - token = Token( + var token = Token( TokenType.NEWLINE, "\r\n", self.position.line, @@ -729,7 +729,7 @@ struct Tokenizer: self._advance() # Skip \n return token^ else: - token = Token( + var token = Token( TokenType.NEWLINE, "\r", self.position.line, @@ -738,7 +738,7 @@ struct Tokenizer: self._advance() return token^ elif self.current_char == "\n": - token = Token( + var token = Token( TokenType.NEWLINE, "\n", self.position.line, @@ -748,21 +748,21 @@ struct Tokenizer: return token^ if self.current_char == "=": - token = Token( + var token = Token( TokenType.EQUAL, "=", self.position.line, self.position.column ) self._advance() return token^ if self.current_char == ",": - token = Token( + var token = Token( TokenType.COMMA, ",", self.position.line, self.position.column ) self._advance() return token^ if self.current_char == ".": - token = Token( + var token = Token( TokenType.DOT, ".", self.position.line, self.position.column ) self._advance() @@ -772,7 +772,7 @@ struct Tokenizer: # Check if next char is also [ if self._get_char(self.position.index + 1) == "[": # This is an array of tables start - token = Token( + var token = Token( TokenType.ARRAY_OF_TABLES_START, "[[", self.position.line, @@ -783,7 +783,7 @@ struct Tokenizer: return token^ else: # Regular table start - token = Token( + var token = Token( TokenType.TABLE_START, "[", self.position.line, @@ -793,7 +793,7 @@ struct Tokenizer: return token^ if self.current_char == "]": - token = Token( + var token = Token( TokenType.ARRAY_END, "]", self.position.line, @@ -803,7 +803,7 @@ struct Tokenizer: return token^ if self.current_char == "{": - token = Token( + var token = Token( TokenType.INLINE_TABLE_START, "{", self.position.line, @@ -813,7 +813,7 @@ struct Tokenizer: return token^ if self.current_char == "}": - token = Token( + var token = Token( TokenType.INLINE_TABLE_END, "}", self.position.line, @@ -871,7 +871,7 @@ struct Tokenizer: return self._read_key() # Unrecognized character - token = Token( + var token = Token( TokenType.ERROR, "Unexpected character: " + self.current_char, self.position.line, diff --git a/tests/bigdecimal/test_bigdecimal_arithmetics.mojo b/tests/bigdecimal/test_bigdecimal_arithmetics.mojo index f315de98..1c4c6c2b 100644 --- a/tests/bigdecimal/test_bigdecimal_arithmetics.mojo +++ b/tests/bigdecimal/test_bigdecimal_arithmetics.mojo @@ -36,7 +36,7 @@ def test_bigdecimal_arithmetics() raises: # ------------------------------------------------------- test_cases = load_test_cases(toml, "addition_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BDec(test_case.a).add(BDec(test_case.b)) var mojo_str = String(result) diff --git a/tests/bigdecimal/test_bigdecimal_exponential.mojo b/tests/bigdecimal/test_bigdecimal_exponential.mojo index a6a88754..f6e44e82 100644 --- a/tests/bigdecimal/test_bigdecimal_exponential.mojo +++ b/tests/bigdecimal/test_bigdecimal_exponential.mojo @@ -27,7 +27,7 @@ def test_bigdecimal_exponential() raises: # ------------------------------------------------------- test_cases = load_test_cases(toml, "sqrt_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BDec(test_case.a).sqrt(precision=28) var mojo_str = String(result) diff --git a/tests/bigdecimal/test_bigdecimal_rounding.mojo b/tests/bigdecimal/test_bigdecimal_rounding.mojo index b0ea1678..6172fea8 100644 --- a/tests/bigdecimal/test_bigdecimal_rounding.mojo +++ b/tests/bigdecimal/test_bigdecimal_rounding.mojo @@ -27,7 +27,7 @@ def test_bigdecimal_rounding() raises: pydecimal.getcontext().rounding = pydecimal.ROUND_DOWN test_cases = load_test_cases(toml, "round_down_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var precision = Int(test_case.b) var result = BDec(test_case.a).round(precision, RoundingMode.down()) diff --git a/tests/bigdecimal/test_bigdecimal_trigonometric.mojo b/tests/bigdecimal/test_bigdecimal_trigonometric.mojo index cb759070..f316e088 100644 --- a/tests/bigdecimal/test_bigdecimal_trigonometric.mojo +++ b/tests/bigdecimal/test_bigdecimal_trigonometric.mojo @@ -20,7 +20,7 @@ def run_test[ # print("------------------------------------------------------") # print("Testing BigDecimal ", msg, "...", sep="") var test_cases = load_test_cases(toml, table_name) - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var _bdec = BigDecimal(test_case.a) var result = func(_bdec, 50) diff --git a/tests/bigint10/test_bigint10_arithmetics.mojo b/tests/bigint10/test_bigint10_arithmetics.mojo index 7ab53c08..268db7f9 100644 --- a/tests/bigint10/test_bigint10_arithmetics.mojo +++ b/tests/bigint10/test_bigint10_arithmetics.mojo @@ -40,7 +40,7 @@ def test_bigint10_arithmetics() raises: # ------------------------------------------------------- test_cases = load_test_cases(toml, "addition_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigInt10(test_case.a) + BigInt10(test_case.b) var mojo_str = String(result) @@ -151,7 +151,7 @@ def test_bigint10_multiply() raises: # ------------------------------------------------------- test_cases = load_test_cases(toml, "multiplication_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigInt10(test_case.a) * BigInt10(test_case.b) var mojo_str = String(result) @@ -184,7 +184,7 @@ def test_bigint10_floor_divide() raises: # ------------------------------------------------------- test_cases = load_test_cases(toml, "floor_divide_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigInt10(test_case.a) // BigInt10(test_case.b) var mojo_str = String(result) @@ -218,7 +218,7 @@ def test_bigint10_truncate_divide() raises: # ------------------------------------------------------- test_cases = load_test_cases(toml, "truncate_divide_tests") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigInt10(test_case.a).truncate_divide( BigInt10(test_case.b) diff --git a/tests/biguint/test_biguint_arithmetics.mojo b/tests/biguint/test_biguint_arithmetics.mojo index 29081419..40e3b7b4 100644 --- a/tests/biguint/test_biguint_arithmetics.mojo +++ b/tests/biguint/test_biguint_arithmetics.mojo @@ -41,7 +41,7 @@ def test_biguint_arithmetics() raises: test_cases = load_test_cases(toml, "addition_tests") assert_true(len(test_cases) > 0, "No addition test cases found") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigUInt(test_case.a) + BigUInt(test_case.b) var mojo_str = String(result) @@ -170,7 +170,7 @@ def test_biguint_truncate_divide() raises: test_cases = load_test_cases(toml, "truncate_divide_tests") assert_true(len(test_cases) > 0, "No truncate division test cases found") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigUInt(test_case.a) // BigUInt(test_case.b) var mojo_str = String(result) @@ -200,6 +200,8 @@ def test_biguint_truncate_divide_random_numbers_against_python() raises: var number_a: String var number_b: String + var decimo_result: String + var python_result: String for _test_case in range(10): number_a = String("") diff --git a/tests/biguint/test_biguint_exponential.mojo b/tests/biguint/test_biguint_exponential.mojo index 4223e5a6..92311152 100644 --- a/tests/biguint/test_biguint_exponential.mojo +++ b/tests/biguint/test_biguint_exponential.mojo @@ -36,7 +36,7 @@ def test_biguint_sqrt() raises: test_cases = load_test_cases[unary=True](toml, "sqrt_tests") assert_true(len(test_cases) > 0, "No sqrt test cases found") - count_wrong = 0 + var count_wrong = 0 for test_case in test_cases: var result = BigUInt(test_case.a).sqrt() var mojo_str = String(result) @@ -66,6 +66,8 @@ def test_biguint_sqrt_random_numbers_against_python() raises: _set_max_str_digits(25000) var number_a: String + var decimo_result: String + var python_result: String for _test_case in range(10): number_a = String("") diff --git a/tests/numerals/test_chinese.mojo b/tests/numerals/test_chinese.mojo index 368bb10a..1e1ddc2b 100644 --- a/tests/numerals/test_chinese.mojo +++ b/tests/numerals/test_chinese.mojo @@ -261,7 +261,7 @@ def test_traditional_financial_style() raises: def test_custom_style() raises: """A hand-built style works like the presets.""" - var digits: InlineArray[StaticString, 10] = [ + var digits: Array[StaticString, 10] = [ "0", "1", "2", @@ -273,7 +273,7 @@ def test_custom_style() raises: "8", "9", ] - var units: InlineArray[StaticString, 3] = ["T", "H", "K"] + var units: Array[StaticString, 3] = ["T", "H", "K"] var style = ChineseNumeralStyle(digits, units, "W", "Y", ".", "-", False) testing.assert_equal(decimal_string_to_chinese("10001.5", style), "1W01.5") diff --git a/tests/toml/test_decimo_toml.mojo b/tests/toml/test_decimo_toml.mojo index 4bd45186..3b4eba59 100644 --- a/tests/toml/test_decimo_toml.mojo +++ b/tests/toml/test_decimo_toml.mojo @@ -115,9 +115,9 @@ key = "value" ) var a = doc.get("a") assert_true(a.is_table(), "dotted header a is table") - var b = a.as_table()["b"] + ref b = a.as_table()["b"] assert_true(b.is_table(), "dotted header b is table") - var c = b.as_table()["c"] + ref c = b.as_table()["c"] assert_true(c.is_table(), "dotted header c is table") assert_true(c.as_table()["key"].as_string() == "value", "dotted header val") print(" PASS test_dotted_table_headers") From 4647735395ec4536522b5cc1069e56e6326c564e Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Mon, 10 Aug 2026 22:22:41 +0200 Subject: [PATCH 07/10] Make some temp List to Array --- src/decimo/bigint/arithmetics.mojo | 71 +++++++++++++++++-- .../test_bigdecimal_exponential.mojo | 4 +- tests/bigdecimal/test_bigdecimal_methods.mojo | 10 +-- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/decimo/bigint/arithmetics.mojo b/src/decimo/bigint/arithmetics.mojo index d956da9e..f7ebff65 100644 --- a/src/decimo/bigint/arithmetics.mojo +++ b/src/decimo/bigint/arithmetics.mojo @@ -93,6 +93,36 @@ def _add_magnitudes(a: List[UInt32], b: List[UInt32]) -> List[UInt32]: return result^ +def _add_magnitudes(a: List[UInt32], b: UInt32) -> List[UInt32]: + """Adds a single-word magnitude to a magnitude: a + b. + + Overload of the two-list version for the common `a + small` case. It + avoids heap-allocating a one-element list for `b` and drops the + per-word bounds test that the general version needs. + + Args: + a: The magnitude (little-endian UInt32 words). + b: The single-word value to add. + + Returns: + The sum magnitude as a new word list. + """ + var len_a = len(a) + var result = List[UInt32](capacity=len_a + 1) + result.resize(unsafe_uninit_length=len_a) + + var carry = UInt64(b) + for i in range(len_a): + var s = UInt64(a[i]) + carry + result[i] = UInt32(s & 0xFFFF_FFFF) + carry = s >> 32 + + if carry > 0: + result.append(UInt32(carry)) + + return result^ + + def _add_magnitudes_into( mut result: List[UInt32], imm a: List[UInt32], @@ -568,6 +598,38 @@ def _add_magnitudes_inplace(mut a: List[UInt32], imm b: List[UInt32]): a.shrink(len(a) - 1) +def _add_magnitudes_inplace(mut a: List[UInt32], b: UInt32): + """Adds a single-word magnitude into a in-place: a += b. + + Overload of the two-list version for the common `a += small` case. Beyond + skipping the one-element list allocation, it stops as soon as the carry is + absorbed instead of walking all of `a`. + + Args: + a: The accumulator magnitude (modified in-place). + b: The single-word value to add. + """ + var len_a = len(a) + var carry = UInt64(b) + var i = 0 + while carry > 0 and i < len_a: + var s = UInt64(a[i]) + carry + a[i] = UInt32(s & 0xFFFF_FFFF) + carry = s >> 32 + i += 1 + + if carry > 0: + a.append(UInt32(carry)) + return + + # Trim trailing zero words, matching the two-list overload. + var alen = len(a) + while alen > 1 and a[alen - 1] == 0: + alen -= 1 + while len(a) > alen: + a.shrink(len(a) - 1) + + def _add_at_offset_inplace( mut a: List[UInt32], imm b: List[UInt32], offset: Int ): @@ -2109,8 +2171,7 @@ def floor_divide_inplace(mut x: BigInt, imm other: BigInt) raises: x.sign = not q_is_zero else: # Non-exact: floor division rounds away from zero for negative - var one_word: List[UInt32] = [UInt32(1)] - _add_magnitudes_inplace(q_words, one_word) + _add_magnitudes_inplace(q_words, UInt32(1)) x.words = q_words^ x.sign = True @@ -2205,8 +2266,7 @@ def floor_divide(x1: BigInt, x2: BigInt) raises -> BigInt: else: # Non-exact: floor division rounds away from zero for negative # results, so quotient = -(|q| + 1) - var one_word: List[UInt32] = [UInt32(1)] - var q_plus_one = _add_magnitudes(q_words, one_word) + var q_plus_one = _add_magnitudes(q_words, UInt32(1)) return BigInt(raw_words=q_plus_one^, sign=True) @@ -2358,8 +2418,7 @@ def floor_divmod(x1: BigInt, x2: BigInt) raises -> Tuple[BigInt, BigInt]: return (BigInt(raw_words=q_words^, sign=not q_is_zero), BigInt()) else: # floor_div rounds toward negative infinity, mod has sign of divisor - var one_word: List[UInt32] = [UInt32(1)] - var q_plus_one = _add_magnitudes(q_words, one_word) + var q_plus_one = _add_magnitudes(q_words, UInt32(1)) var adjusted = _subtract_magnitudes(x2.words, r_words) return ( BigInt(raw_words=q_plus_one^, sign=True), diff --git a/tests/bigdecimal/test_bigdecimal_exponential.mojo b/tests/bigdecimal/test_bigdecimal_exponential.mojo index f6e44e82..c20c3bcf 100644 --- a/tests/bigdecimal/test_bigdecimal_exponential.mojo +++ b/tests/bigdecimal/test_bigdecimal_exponential.mojo @@ -86,7 +86,7 @@ def test_sqrt_multi_precision() raises: var pydecimal = Python.import_module("decimal") # Inputs: perfect squares, decimal perfect squares, irrationals, sci notation - var inputs: List[String] = [ + var inputs = [ "0", "1", "4", @@ -109,7 +109,7 @@ def test_sqrt_multi_precision() raises: "1E-100", ] - var precisions: List[Int] = [1, 2, 3, 5, 10, 28, 50] + var precisions = [1, 2, 3, 5, 10, 28, 50] var count_wrong = 0 for i in range(len(inputs)): diff --git a/tests/bigdecimal/test_bigdecimal_methods.mojo b/tests/bigdecimal/test_bigdecimal_methods.mojo index e3be38f2..da7cfe99 100644 --- a/tests/bigdecimal/test_bigdecimal_methods.mojo +++ b/tests/bigdecimal/test_bigdecimal_methods.mojo @@ -101,8 +101,8 @@ def test_rtruediv_negative() raises: def test_rtruediv_symmetry() raises: """Verify a / b == b.__rtruediv__(a) for various pairs.""" - var as_: List[String] = ["10", "1", "100", "-5"] - var bs: List[String] = ["3", "7", "6", "2"] + var as_ = ["10", "1", "100", "-5"] + var bs = ["3", "7", "6", "2"] for i in range(len(as_)): var a = BigDecimal(as_[i]) var b = BigDecimal(bs[i]) @@ -186,7 +186,7 @@ def test_to_eng_string_negative() raises: def test_to_eng_string_is_alias() raises: """Verify to_eng_string() returns the same as to_string(engineering=True). """ - var values: List[String] = ["123456.789", "0.00123", "-9.99E+10", "0"] + var values = ["123456.789", "0.00123", "-9.99E+10", "0"] for i in range(len(values)): var d = BigDecimal(values[i]) testing.assert_equal( @@ -199,7 +199,7 @@ def test_to_eng_string_is_alias() raises: def test_to_scientific_string_is_alias() raises: """Verify to_scientific_string() returns the same as to_string(scientific=True). """ - var values: List[String] = ["123456.789", "0.00123", "-9.99E+10", "0"] + var values = ["123456.789", "0.00123", "-9.99E+10", "0"] for i in range(len(values)): var d = BigDecimal(values[i]) testing.assert_equal( @@ -345,7 +345,7 @@ def test_as_tuple_zero() raises: def test_as_tuple_reconstruct() raises: """Round-trip: reconstruct BigDecimal from (sign, digits, exponent).""" - var values: List[String] = ["123.456", "-0.001", "12345", "0"] + var values = ["123.456", "-0.001", "12345", "0"] for vi in range(len(values)): var d = BigDecimal(values[vi]) var t = d.as_tuple() From df008d21efa710e5befe65923aad7992603eb596 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 12 Aug 2026 16:39:36 +0200 Subject: [PATCH 08/10] Remove some todos that are outdated + Use ImmSpan for slice operations in bigint --- benches/bigdecimal/mojo/bench.mojo | 4 +- benches/bigint/mojo/bench.mojo | 4 +- docs/user_manual.md | 22 +- pixi.lock | 863 +++++++++++------- pixi.toml | 17 +- src/decimo/bigdecimal/bigdecimal.mojo | 82 +- src/decimo/bigdecimal/exponential.mojo | 14 +- src/decimo/bigint/arithmetics.mojo | 469 ++++------ src/decimo/bigint/bigint.mojo | 113 +-- src/decimo/bigint/exponential.mojo | 2 +- src/decimo/bigint/number_theory.mojo | 13 +- src/decimo/bigint10/bigint10.mojo | 87 +- src/decimo/biguint/biguint.mojo | 207 +++-- .../bigint/test_bigint_large_algorithms.mojo | 470 ++++++++++ tests/biguint/test_biguint_construction.mojo | 142 +++ 15 files changed, 1509 insertions(+), 1000 deletions(-) create mode 100644 tests/bigint/test_bigint_large_algorithms.mojo create mode 100644 tests/biguint/test_biguint_construction.mojo diff --git a/benches/bigdecimal/mojo/bench.mojo b/benches/bigdecimal/mojo/bench.mojo index 27b3c1bd..37f061eb 100644 --- a/benches/bigdecimal/mojo/bench.mojo +++ b/benches/bigdecimal/mojo/bench.mojo @@ -305,9 +305,9 @@ def _bench_case( # - arithmetic / sqrt / exp / ln: as-is (sqrt/exp/ln are unary) # - root: b is the root index n if op == "round" or op == "from_string" or op == "to_string": - b = BigDecimal.from_int(0) + b = BigDecimal.from_integral_scalar(0) elif bc.b == "": - b = BigDecimal.from_int(0) + b = BigDecimal.from_integral_scalar(0) else: b = BigDecimal(bc.b) diff --git a/benches/bigint/mojo/bench.mojo b/benches/bigint/mojo/bench.mojo index a46e1baa..1c511423 100644 --- a/benches/bigint/mojo/bench.mojo +++ b/benches/bigint/mojo/bench.mojo @@ -192,10 +192,10 @@ def _bench_case( var b: BigInt var b_int: Int = 0 if op == "power" or op == "shift": - b = BigInt.from_int(0) + b = BigInt.from_integral_scalar(0) b_int = Int(BigInt(bc.b)) elif op == "sqrt" or op == "from_string" or op == "to_string" or bc.b == "": - b = BigInt.from_int(0) + b = BigInt.from_integral_scalar(0) else: b = BigInt(bc.b) diff --git a/docs/user_manual.md b/docs/user_manual.md index c09621ec..8c7008d8 100644 --- a/docs/user_manual.md +++ b/docs/user_manual.md @@ -150,10 +150,8 @@ Accepts any integral scalar type (`Int8` through `Int256`, `UInt8` through `UInt | Constructor | Description | | ---------------------------------- | ------------------------------------- | | `BInt()` | Zero | -| `BInt(value: Int)` | From `Int` (implicit) | | `BInt(value: String)` | From decimal string (raises) | -| `BInt(value: Scalar)` | From integral scalar (implicit) | -| `BInt.from_int(value)` | Explicit factory from `Int` | +| `BInt(value: Scalar)` | From any integral scalar (implicit) | | `BInt.from_integral_scalar(value)` | From any integral scalar type | | `BInt.from_string(value)` | Explicit factory from string (raises) | | `BInt.from_bigint10(value)` | Convert from `BigInt10` | @@ -554,13 +552,9 @@ var b = Decimal(py=py_dec) # Alternative keyword-only syntax | Constructor | Description | | ------------------------------------- | ------------------------------- | | `Decimal()` | Zero | -| `Decimal(value: Int)` | From `Int` (implicit) | -| `Decimal(value: UInt)` | From `UInt` (implicit) | | `Decimal(value: String)` | From string (raises) | -| `Decimal(value: Scalar)` | From integral scalar (implicit) | +| `Decimal(value: Scalar)` | From any integral scalar (impl) | | `Decimal(py=py_obj)` | From Python `Decimal` (raises) | -| `Decimal.from_int(value)` | Explicit factory from `Int` | -| `Decimal.from_uint(value)` | Explicit factory from `UInt` | | `Decimal.from_integral_scalar(value)` | From any integral scalar type | | `Decimal.from_float(value)` | From floating-point (raises) | | `Decimal.from_string(value)` | Explicit factory from string | @@ -1037,12 +1031,12 @@ print(Decimal("2.000").to_chinese()) # 二点零零零 The character tables are supplied by `ChineseNumeralStyle`, which ships with four presets: -| Preset | Digits | Units | 10^4 / 10^8 | Point | Example for `1050` | -| ------------------------- | ------ | -------- | ----------- | ----- | ------------------ | -| `simplified()` (default) | 一二三 | 十百千 | 万 / 亿 | 点 | `一千零五十` | -| `simplified_financial()` | 壹贰叁 | 拾佰仟 | 万 / 亿 | 点 | `壹仟零伍拾` | -| `traditional()` | 一二三 | 十百千 | 萬 / 億 | 點 | `一千零五十` | -| `traditional_financial()` | 壹貳參 | 拾佰仟 | 萬 / 億 | 點 | `壹仟零伍拾` | +| Preset | Digits | Units | 10^4 / 10^8 | Point | Example for `1050` | +| ------------------------- | ------ | ------ | ----------- | ----- | ------------------ | +| `simplified()` (default) | 一二三 | 十百千 | 万 / 亿 | 点 | `一千零五十` | +| `simplified_financial()` | 壹贰叁 | 拾佰仟 | 万 / 亿 | 点 | `壹仟零伍拾` | +| `traditional()` | 一二三 | 十百千 | 萬 / 億 | 點 | `一千零五十` | +| `traditional_financial()` | 壹貳參 | 拾佰仟 | 萬 / 億 | 點 | `壹仟零伍拾` | ```mojo from decimo import ChineseNumeralStyle diff --git a/pixi.lock b/pixi.lock index d8dbc9c9..952af153 100644 --- a/pixi.lock +++ b/pixi.lock @@ -14,7 +14,6 @@ platforms: environments: default: channels: - - url: https://conda.modular.com/max-nightly/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - url: https://conda.anaconda.org/conda-forge/ @@ -22,40 +21,41 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py314h4a8dc5f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-50.0.0-py314h7fe84b3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h0d30a3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.16.2-h462bb3b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py314h5bd0f2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda @@ -64,17 +64,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda @@ -94,10 +94,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -105,7 +105,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda @@ -115,37 +115,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-7.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.1.0.dev2026081005-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.1.0.dev2026081005-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.6.0.dev2026081005-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.1.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-1.0.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.5.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0-release.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.1.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda @@ -160,18 +160,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda @@ -181,45 +180,45 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-7.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py314h7bede21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/editdistance-0.8.1-py314h4ed92d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hc7cc350_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-hf4d206d_102_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.16.2-h828de30_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.8-py314h6c2aa35_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-26.6.0.dev2026081005-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.1.0.dev2026081005-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.1.0.dev2026081005-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.1.0.dev2026081005-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.5.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0-release.conda packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -232,6 +231,9 @@ packages: - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + strong: + - _openmp_mutex >=4.5 size: 28948 timestamp: 1770939786096 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda @@ -247,21 +249,25 @@ packages: - libbrotlicommon 1.2.0 hb03c661_1 license: MIT license_family: MIT + run_exports: {} size: 367376 timestamp: 1764017265553 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 - md5: d2ffd7602c02f2b316fd921d39876885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 + md5: e675fabcf81499adc7edf58124fb1e01 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: bzip2-1.0.6 license_family: BSD - size: 260182 - timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda - sha256: 39d0d45c4c73162c0aadd0b1bce6ce42ca354da65979f49d6084ff00ed5c26b4 - md5: 26f3b9c52441a170b2008cbc227f740a + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 257808 + timestamp: 1785906269155 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py314h4a8dc5f_0.conda + sha256: eec96c89f9f445da65cfc315e9c8572968335e127a18f17104bc9a90df103058 + md5: f10f311ad713701678c05ecc19c22784 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 @@ -271,8 +277,9 @@ packages: - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 306297 - timestamp: 1783424159025 + run_exports: {} + size: 306515 + timestamp: 1785810913099 - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda sha256: f80e00a568128566ac97787afcc2701bd3e636799363b9e2c88ce8733361e525 md5: a072db87d32836deeeffd30995529d63 @@ -283,11 +290,12 @@ packages: - __glibc >=2.17 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 1280692 timestamp: 1783844531090 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda - sha256: 1c8128f2ba8fccf627729968de7fe7504dbb775c829e533439c9ee52134800fd - md5: b1dd101231d277ad724c40c788f6fdd8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-50.0.0-py314h7fe84b3_0.conda + sha256: fd903503d8e7ab2c70ce839f05a80ecd67bcda710a2490179e7280b4e2943ca4 + md5: 557e2f330a5015e0e79185c30bd7e5ad depends: - __glibc >=2.17,<3.0.a0 - cffi >=2.0 @@ -299,8 +307,9 @@ packages: - __glibc >=2.17 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1930691 - timestamp: 1781385496617 + run_exports: {} + size: 1914834 + timestamp: 1785640778304 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 md5: ce96f2f470d39bd96ce03945af92e280 @@ -312,8 +321,25 @@ packages: - libglib >=2.86.2,<3.0a0 - libexpat >=2.7.3,<3.0a0 license: AFL-2.1 OR GPL-2.0-or-later + run_exports: + weak: + - dbus >=1.16.2,<2.0a0 size: 447649 timestamp: 1764536047944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + sha256: d7c260b7e1cf22ce04d6ba8a86eabf4e6c50bc96a5c27fe2ecb32298af3e88eb + md5: 4ef4b977bb216a3001a3334696a80850 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14455340 + timestamp: 1784916378180 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 md5: b38117a3c920364aff79f870c984b4a3 @@ -321,6 +347,9 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: LGPL-2.1-or-later + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 size: 134088 timestamp: 1754905959823 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda @@ -336,6 +365,9 @@ packages: - openssl >=3.5.7,<4.0a0 license: MIT license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 size: 1388990 timestamp: 1781859420533 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda @@ -348,6 +380,7 @@ packages: - binutils_impl_linux-64 2.46.1 license: GPL-3.0-only license_family: GPL + run_exports: {} size: 745303 timestamp: 1784214507189 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -360,6 +393,9 @@ packages: - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 size: 134676 timestamp: 1738479519902 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda @@ -372,6 +408,7 @@ packages: - expat 2.8.1.* license: MIT license_family: MIT + run_exports: {} size: 77856 timestamp: 1781203599810 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda @@ -382,45 +419,55 @@ packages: - libgcc >=14 license: MIT license_family: MIT + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 size: 58592 timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 - md5: 57736f29cc2b0ec0b6c2952d3f101b6a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + sha256: d5cb8475131c31680f8fd30512c418f373064e272e452063276a8fb14c9fa42f + md5: 5a7d954665c707c93311657cd779c705 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.2.0=*_19 - - libgomp 15.2.0 he0feb66_19 + - libgomp 16.1.0 he0feb66_1 + - libgcc-ng ==16.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1041084 - timestamp: 1778269013026 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda - sha256: 4bee10e62796f01e4fa2b5849135b1cc061337fe9cf5eb9bd79e9664922ae0e4 - md5: 889febc66cd9e4190f80ef9718fa239b + run_exports: {} + size: 1057877 + timestamp: 1785375436766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h0d30a3d_0.conda + sha256: 69ea4df61403531e5b3e5f3d52ba2837423df361b4eb8727f5b63aaf6de6768a + md5: 17c3b7b6bcbd35b688c933eb4834c0bc depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libiconv >=1.18,<2.0a0 - libzlib >=1.3.2,<2.0a0 - - libffi >=3.5.2,<3.6.0a0 - pcre2 >=10.47,<10.48.0a0 + - libffi >=3.5.2,<3.6.0a0 constrains: - glib >2.66 license: LGPL-2.1-or-later - size: 4754220 - timestamp: 1782463895250 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b - md5: faac990cb7aedc7f3a2224f2c9b0c26c + run_exports: + weak: + - libglib >=2.88.3,<3.0a0 + size: 4755324 + timestamp: 1785442107463 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + sha256: 62cb599ad0539d99386515326d9d5e8f51f75a60c69c2131b21df76edf35bd89 + md5: 88f2d91cb1533194c323534253094d23 depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 603817 - timestamp: 1778268942614 + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 640415 + timestamp: 1785375373755 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -428,19 +475,25 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-only + run_exports: + weak: + - libiconv >=1.18,<2.0a0 size: 790176 timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d - md5: b88d90cad08e6bc8ad540cb310a761fb +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + sha256: 9787df8c22a59c9a70d3e5a10db9ad663485e75e9ccc3f09bd092cb7b95e0dab + md5: 1390b7c5ac0b1d8e447bc5efa6d3c8c2 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - xz 5.8.3.* license: 0BSD - size: 113478 - timestamp: 1775825492909 + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 112995 + timestamp: 1786348617826 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 md5: 2c21e66f50753a083cbe6b80f38268fa @@ -449,6 +502,7 @@ packages: - libgcc >=14 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 92400 timestamp: 1769482286018 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda @@ -458,30 +512,38 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: ISC + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 size: 269272 timestamp: 1779163468406 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - sha256: 365376f4815e5e80def2b3462a2419708b7c292da0da85278386c2618621fff4 - md5: 4aed8e657e9ff156bdbe849b4df44389 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + sha256: 72023efc207fe681e26b65fc9d668062cf0b4f0eacf3431e6eb099b95c1f2efd + md5: df088a279cd5e6fd2790b4c196434da1 depends: - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing - size: 962119 - timestamp: 1782519076616 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc - md5: 5794b3bdc38177caf969dabd3af08549 + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 964200 + timestamp: 1785016112246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + sha256: 79721dd08aeb0ab9e773f1f9ef41cf4e6c17477e3d72319147619045bce05a09 + md5: aed6cf89adc1e9b846e4367ac538e434 depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_19 + - libgcc 16.1.0 ha9f2e26_1 constrains: - - libstdcxx-ng ==15.2.0=*_19 + - libstdcxx-ng ==16.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 5852044 - timestamp: 1778269036376 + run_exports: {} + size: 6631744 + timestamp: 1785375462643 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f md5: 01bb81d12c957de066ea7362007df642 @@ -490,28 +552,37 @@ packages: - __glibc >=2.17,<3.0.a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libuuid >=2.42.2,<3.0a0 size: 40017 timestamp: 1781625522462 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 - md5: d87ff7921124eccd67248aa483c23fec +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 + md5: 0de0122d9570a8ab637c6b73db268389 depends: - __glibc >=2.17,<3.0.a0 constrains: - - zlib 1.3.2 *_2 + - zlib 1.3.2 *_3 license: Zlib license_family: Other - size: 63629 - timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 - md5: fc21868a1a5aacc937e7a18747acb8a5 + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 63713 + timestamp: 1785362952714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + sha256: 5d46557214ed184381dafe835b7c94a474a1c3b307a08a250b1ea4779b44ffb3 + md5: ee6c0cd80a60961a1f48aa3e0b91f986 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: X11 AND BSD-3-Clause - size: 918956 - timestamp: 1777422145199 + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 911196 + timestamp: 1786355078102 - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda noarch: python sha256: 9c651938be7eef8a3d10387a555ad07feea9345750ef0eb09cf5ac70c3a827b0 @@ -526,19 +597,23 @@ packages: - __glibc >=2.17 license: MIT license_family: MIT + run_exports: {} size: 672346 timestamp: 1782129862714 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b - md5: 79dd2074b5cd5c5c6b2930514a11e22d +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + sha256: 012096056b97abf1f68c46b7146bd2cbd68c1be762340b4f5dad4fbbe99177bc + md5: c5955c27917ff2234def47f075e71e02 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3159683 - timestamp: 1781069855778 + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3182423 + timestamp: 1785913583650 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff md5: 7a3bff861a6583f1889021facefc08b1 @@ -549,12 +624,15 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 size: 1222481 timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - build_number: 100 - sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 - md5: 0b9b2f83b5b600e1ac38becde8d0dd44 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + build_number: 101 + sha256: ee8f2006e1724b1f2e9e0ccc5a7cfdcab973460faa2f63ac1f6e44fdad4c0344 + md5: 78975a41cf3c525da654f17e35bfca9e depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -564,8 +642,8 @@ packages: - libgcc >=14 - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 - - libuuid >=2.42.1,<3.0a0 + - libsqlite >=3.53.3,<4.0a0 + - libuuid >=2.42.2,<3.0a0 - libzlib >=1.3.2,<2.0a0 - ncurses >=6.6,<7.0a0 - openssl >=3.5.7,<4.0a0 @@ -575,8 +653,13 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 36717183 - timestamp: 1781255094700 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 36869055 + timestamp: 1784910110714 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d @@ -606,6 +689,7 @@ packages: - zeromq >=4.3.5,<4.4.0a0 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 210896 timestamp: 1779483879367 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -617,12 +701,15 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + run_exports: + weak: + - readline >=8.3,<9.0a0 size: 345073 timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.22-h462bb3b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.16.2-h462bb3b_0.conda noarch: python - sha256: 2002c7869a95ed94b03303a033fcc24b608597bdd01c8f01d90c47175616edb9 - md5: ad7d8b2d37a1098a04ddd8b34b962481 + sha256: 2730d570f45ba836f5b85700776cc4527894c640ebacb536fb5db138c845ee63 + md5: 8a00805aae730fb6266343985496ee07 depends: - python - __glibc >=2.17,<3.0.a0 @@ -630,8 +717,10 @@ packages: constrains: - __glibc >=2.17 license: MIT - size: 9333318 - timestamp: 1784237314764 + license_family: MIT + run_exports: {} + size: 9481279 + timestamp: 1786151870074 - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py314hdafbbf9_0.conda sha256: 1493aadd9fcb4894b879ea0e0e0eed4cb60a60a26bb95b821dcb6ea5def47d06 md5: 2d7b5ae8ad713d8a7097a75a248f8ba3 @@ -643,6 +732,7 @@ packages: - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 34939 timestamp: 1780858492554 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda @@ -656,11 +746,14 @@ packages: constrains: - xorg-libx11 >=1.8.13,<2.0a0 license: TCL + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 size: 3550916 timestamp: 1784229071544 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda - sha256: bbb7056f7c5fd606df16ed73ee68687050de2c02fd69a3f69a1cb533a7ed2ae8 - md5: 4a8e5889712641aabdf6695e292857fe +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py314h5bd0f2a_0.conda + sha256: ebec0d90f99fa7bbe91eabab41ee77d3f36dbd58ec2f08aa4220fdd713610b6d + md5: faea84d2f2ccadf70cf9e55381d75b3e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -668,8 +761,9 @@ packages: - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 918368 - timestamp: 1781006801436 + run_exports: {} + size: 923237 + timestamp: 1786226770518 - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda sha256: c84034056dc938c853e4f61e72e5bd37e2ec91927a661fb9762f678cbea52d43 md5: 5d3c008e54c7f49592fca9c32896a76f @@ -709,6 +803,9 @@ packages: - libsodium >=1.0.22,<1.0.23.0a0 license: MPL-2.0 license_family: MOZILLA + run_exports: + weak: + - zeromq >=4.3.5,<4.4.0a0 size: 311184 timestamp: 1779123989774 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda @@ -719,6 +816,9 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 size: 601375 timestamp: 1764777111296 - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda @@ -729,6 +829,7 @@ packages: - python-gil license: MIT license_family: MIT + run_exports: {} size: 8144 timestamp: 1784221492234 - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda @@ -738,6 +839,7 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 7069 timestamp: 1733218168786 - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -749,6 +851,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 35739 timestamp: 1767290467820 - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda @@ -758,24 +861,27 @@ packages: depends: - python >=3.14 license: BSD-3-Clause AND MIT AND EPL-2.0 + run_exports: {} size: 7526 timestamp: 1781450817767 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf - md5: a9965dd99f683c5f444428f896635716 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6 + md5: 0f51e2391ade309db462a55611263e9c depends: - __unix license: ISC - size: 128866 - timestamp: 1781708962055 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda - sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f - md5: c13824fedced67005d3832c152fe9c2f + run_exports: {} + size: 131780 + timestamp: 1784754889428 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + sha256: fb167de4388e64e52aa3907ed099afab944c1fa6e5f74b281a312dae1bcf7f3b + md5: 37e13edbe3b48f1095a9d085ef9cd83b depends: - python >=3.10 license: ISC - size: 133877 - timestamp: 1781719949728 + run_exports: {} + size: 137015 + timestamp: 1784717699092 - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 md5: 381bd45fb7aa032691f3063aff47e3a1 @@ -793,6 +899,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 61418 timestamp: 1783505332569 - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda @@ -804,6 +911,7 @@ packages: - python >=3.10 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 107155 timestamp: 1783085363526 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -813,18 +921,20 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 27011 timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_102.conda noarch: generic - sha256: 7a548856ef5307890a8cadfc196655117658f8c24589ce175caa4c1c2ded9d13 - md5: b28fe35fd43d5f425c0dccbe5b5039fd + sha256: 4d97fdae803c1ed7c704289d1f856d60e5502f24e93e92f9d45fbea37fd9e9a7 + md5: 6b344ff499096c0b873d202fea1e2fcd depends: - python >=3.14,<3.15.0a0 - python_abi * *_cp314 license: Python-2.0 - size: 49333 - timestamp: 1781254618863 + run_exports: {} + size: 49916 + timestamp: 1786444134021 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda sha256: e2753997b8bd34205f42be01b8bab8037423dc30c02a1ec12de23e5b4c0b0a2e md5: 58638f77697c4f6726753eb8be34818b @@ -844,6 +954,7 @@ packages: - python license: LGPL-3.0-only license_family: LGPL + run_exports: {} size: 459540 timestamp: 1779967837277 - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.2-pyhd8ed1ab_0.conda @@ -855,18 +966,19 @@ packages: run_exports: {} size: 77939 timestamp: 1785376409053 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + sha256: 307dd6ec90140c3cf4171071b0e5e870abec314f4565c1edd5bc433e942cdcc0 + md5: e652ac7756069c456d0da2a922cd7df5 depends: - python >=3.10 - hyperframe >=6.1,<7 - - hpack >=4.1,<5 + - hpack >=4.2,<5 - python license: MIT license_family: MIT - size: 95967 - timestamp: 1756364871835 + run_exports: {} + size: 100789 + timestamp: 1785796355216 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 md5: b395909221b9bd1df066e5930e18855b @@ -874,6 +986,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 32884 timestamp: 1782283986153 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -883,6 +996,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 17397 timestamp: 1737618427549 - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda @@ -894,8 +1008,20 @@ packages: - python license: Apache-2.0 license_family: APACHE + run_exports: {} size: 27972 timestamp: 1770237711404 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.1.4-pyhd8ed1ab_0.tar.bz2 + sha256: 77daa9d3c3d4d367d5c220cbd7043780ec51503aa5aab56ed9a69b419d08174f + md5: 55d365e056cf7fe1497aae0492a675fc + depends: + - editdistance + - python >=3.6 + license: MIT + license_family: MIT + run_exports: {} + size: 78186 + timestamp: 1616113266997 - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 md5: 84a3233b709a289a4ddd7a2fd27dd988 @@ -915,6 +1041,7 @@ packages: - python license: BSD-3-Clause license_family: BSD + run_exports: {} size: 163869 timestamp: 1781620148226 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda @@ -926,6 +1053,7 @@ packages: - python license: Apache-2.0 license_family: APACHE + run_exports: {} size: 34766 timestamp: 1779714582554 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda @@ -938,6 +1066,7 @@ packages: - importlib-resources >=7.1.0,<7.1.1.0a0 license: Apache-2.0 license_family: APACHE + run_exports: {} size: 34809 timestamp: 1776068839274 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda @@ -949,6 +1078,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 14831 timestamp: 1767294269456 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.2-pyhcf101f3_0.conda @@ -960,6 +1090,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 16222 timestamp: 1776862415793 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.6.0-pyhcf101f3_0.conda @@ -971,6 +1102,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 18997 timestamp: 1784015600777 - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda @@ -980,6 +1112,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 40015 timestamp: 1740828380668 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda @@ -995,6 +1128,7 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 106342 timestamp: 1733441040958 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda @@ -1011,6 +1145,7 @@ packages: - pywin32 >=300 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 65503 timestamp: 1760643864586 - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda @@ -1026,6 +1161,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 37924 timestamp: 1763320995459 - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda @@ -1043,6 +1179,7 @@ packages: - secretstorage >=3.2 license: MIT license_family: MIT + run_exports: {} size: 37717 timestamp: 1763320674488 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda @@ -1053,6 +1190,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 69017 timestamp: 1778169663339 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -1062,6 +1200,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 14465 timestamp: 1733255681319 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda @@ -1072,6 +1211,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 71270 timestamp: 1779478190496 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda @@ -1081,6 +1221,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 11766 timestamp: 1745776666688 - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda @@ -1094,16 +1235,17 @@ packages: run_exports: {} size: 40866 timestamp: 1766261270149 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 - md5: 4c06a92e74452cfa53623a81592e8934 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + sha256: c432626b16768b8dab228bfb706f7060c2d462a21c516d240f68f2f902b5a044 + md5: 936687ed80f295a1f5dbcf8bd34c252c depends: - - python >=3.8 + - python >=3.9 - python license: Apache-2.0 license_family: APACHE - size: 91574 - timestamp: 1777103621679 + run_exports: {} + size: 116363 + timestamp: 1785888127370 - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 md5: 11adc78451c998c0fd162584abfa3559 @@ -1111,21 +1253,23 @@ packages: - python >=3.10 license: MPL-2.0 license_family: MOZILLA + run_exports: {} size: 56559 timestamp: 1777271601895 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d - md5: 2c5ef45db85d34799771629bd5860fd7 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.2-pyhcf101f3_0.conda + sha256: eea7ead8bcdc3b307241cbc8d038f8b95db9e351e52f2bf3c12ad55eb4d9a8d1 + md5: 15f2020d6b2ede94d80b2c884a1a6f3e depends: - python >=3.10 - python license: MIT license_family: MIT - size: 26308 - timestamp: 1779972894916 -- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.1-pyha770c72_0.conda - sha256: d1d528a9933378ea3734f3ecac83ed4989dc5cba6c0427b237cf35228873a259 - md5: 5f7aee6aa51642db4b57a7a11611dda1 + run_exports: {} + size: 26869 + timestamp: 1786390868223 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda + sha256: fc0a0620a8f829c46787a9a13ddbae8b6049f2e77da353a8a2adaa01af0da7e2 + md5: c36b88db560b4e74f294380613f1a239 depends: - cfgv >=2.0.0 - identify >=1.0.0 @@ -1136,8 +1280,8 @@ packages: license: MIT license_family: MIT run_exports: {} - size: 202254 - timestamp: 1784706397465 + size: 201879 + timestamp: 1786408353117 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 md5: 9c5491066224083c41b6d5635ed7107b @@ -1156,6 +1300,7 @@ packages: - python >=3.10 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 893031 timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -1166,6 +1311,7 @@ packages: - tomli >=1.1.0 license: MIT license_family: MIT + run_exports: {} size: 15528 timestamp: 1733710122949 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda @@ -1176,6 +1322,7 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 21085 timestamp: 1733217331982 - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda @@ -1193,6 +1340,7 @@ packages: - build <0 license: MIT license_family: MIT + run_exports: {} size: 28946 timestamp: 1778048948266 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -1204,6 +1352,7 @@ packages: - python license: Apache-2.0 license_family: APACHE + run_exports: {} size: 233310 timestamp: 1751104122689 - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.1-pyhcf101f3_0.conda @@ -1219,15 +1368,16 @@ packages: run_exports: {} size: 37229 timestamp: 1785577890125 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda - sha256: 84c129bdd6abcecac42a948f2670d17fe735d02d3a5a483a9b1f1bc33ba38c28 - md5: 224f69f177eb5aae6c9a6052846bf609 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_102.conda + sha256: b15fb3e5daae788ca78844ee4ee9f1a1b07911cd4e83c484d8c1ce2794c6c93b + md5: 364ec4bb854ab4ca9ca4e626a55ea8da depends: - cpython 3.14.6.* - python_abi * *_cp314 license: Python-2.0 - size: 49315 - timestamp: 1781254664376 + run_exports: {} + size: 49897 + timestamp: 1786444152084 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 @@ -1236,6 +1386,7 @@ packages: - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 6989 timestamp: 1752805904792 - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda @@ -1250,6 +1401,7 @@ packages: - python license: Apache-2.0 license_family: APACHE + run_exports: {} size: 22324 timestamp: 1781105511621 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda @@ -1266,6 +1418,7 @@ packages: - chardet >=3.0.2,<8 license: Apache-2.0 license_family: APACHE + run_exports: {} size: 68709 timestamp: 1778851103479 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda @@ -1276,6 +1429,7 @@ packages: - requests >=2.0.1,<3.0.0 license: Apache-2.0 license_family: APACHE + run_exports: {} size: 44285 timestamp: 1733734886897 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda @@ -1285,6 +1439,7 @@ packages: - python >=3.9 license: Apache-2.0 license_family: APACHE + run_exports: {} size: 38028 timestamp: 1733921806657 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda @@ -1298,6 +1453,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 208577 timestamp: 1775991661559 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda @@ -1318,6 +1474,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 18455 timestamp: 1753199211006 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda @@ -1328,38 +1485,40 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 21561 timestamp: 1774492402955 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda - sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431 - md5: 37e3be7b6e2977d37b8fa5da229f5dc0 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + sha256: 03dba5917f944c6684ab44c81daacac1624cd148e4b2cae215dcec594a210c48 + md5: a79bf97561232a31447b6246c2153ab5 depends: - python >=3.10 - python license: BSD-3-Clause license_family: BSD - size: 115158 - timestamp: 1780507822178 -- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda - sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb - md5: 901a86453fa6183e914b937643619a03 + run_exports: {} + size: 116935 + timestamp: 1785761789772 +- conda: https://conda.anaconda.org/conda-forge/noarch/twine-7.0.0-pyhcf101f3_0.conda + sha256: 9abcd51d09a4d2da757861ad4684b02ae82ff721db6644e6fe477c5fd7e9278c + md5: e1d7495efcd3d0bc79bdc6cc5a34b8ba depends: - id - - importlib-metadata >=3.6 - keyring >=21.2.0 - - packaging >=24.0 + - packaging >=26.1 - python >=3.10 - readme_renderer >=35.0 - requests >=2.20 - requests-toolbelt >=0.8.0,!=0.9.0 - rfc3986 >=1.4.0 - - rich >=12.0.0 + - rich >=14.3.3 - urllib3 >=1.26.0 - python license: Apache-2.0 license_family: APACHE - size: 42488 - timestamp: 1757013705407 + run_exports: {} + size: 42936 + timestamp: 1785252141368 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 md5: c70ad746c22219b9700931707482992c @@ -1368,12 +1527,14 @@ packages: - python license: PSF-2.0 license_family: PSF + run_exports: {} size: 52631 timestamp: 1783002732887 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 md5: fcb489df604d100968b737f2cb6076c6 license: LicenseRef-Public-Domain + run_exports: {} size: 118849 timestamp: 1784250406640 - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda @@ -1387,11 +1548,12 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 103560 timestamp: 1778188657149 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.3-pyhcf101f3_0.conda - sha256: 33fd59a523f014938b570b773bcd0e10c3d005d25bcaa7e3038eeb57f83a8ae3 - md5: f493af83e599a1b8b103afaf99c38dd6 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda + sha256: 27c96f147dd74c713b3d4696a53c0c5adf890f2fb3fa512419728cb0026461e7 + md5: 90a05eca97a7d9a34a055b3d12be08ad depends: - python >=3.10 - distlib >=0.3.7,<1 @@ -1403,8 +1565,8 @@ packages: - python license: MIT run_exports: {} - size: 3744220 - timestamp: 1786221803596 + size: 3894937 + timestamp: 1786427893830 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 md5: ba3dcdc8584155c97c648ae9c044b7a3 @@ -1413,6 +1575,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 24190 timestamp: 1779159948016 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda @@ -1428,32 +1591,21 @@ packages: - libbrotlicommon 1.2.0 hc919400_1 license: MIT license_family: MIT + run_exports: {} size: 359854 timestamp: 1764018178608 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df - md5: 620b85a3f45526a8bc4d23fd78fc22f0 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda + sha256: 8ec22f0ba25cbfc2e64d70cf29459eccd7ffdf6436f6a6ff15bbfef799f7d4f6 + md5: b50612e7d190b8061ab4e7dc119cf4d5 depends: - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD - size: 124834 - timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py314h7bede21_0.conda - sha256: b6c9358ee7cabfb417e6a8d2758c2241fe6b24f9fd316561a449ccac1959f8e1 - md5: 4648b9514e3cd095788963779cebcc7a - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - run_exports: {} - size: 297593 - timestamp: 1785811327918 + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 124965 + timestamp: 1785906749812 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/comrak-0.54.0-h6fdd925_0.conda sha256: 07a9e5db549ea212bcd8543595340918e455affb4b4b126e6d3c6ff1fc15d2ae md5: 7be112e4bbfe38ae52a82d64fb5193b1 @@ -1463,8 +1615,35 @@ packages: - __osx >=11.0 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 1208953 timestamp: 1783844567994 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/editdistance-0.8.1-py314h4ed92d5_0.conda + sha256: af66117a3ba76309b03b09b0d042584a7ad01ac7031629414f1ca8e902b69040 + md5: 419caf63c5b7b06565c5c7fb99e19b84 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 86872 + timestamp: 1773164671184 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hc7cc350_2.conda + sha256: f0b22bc30e4cc29e29ba3234cb38497fe8def2c2aae4b775d42fe5b378a018c9 + md5: 6133ddbb17ba2b50700dd88e9303ce27 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14070698 + timestamp: 1784916459058 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 md5: 8780f41b013d19219faef9c82260744b @@ -1476,6 +1655,9 @@ packages: - openssl >=3.5.7,<4.0a0 license: MIT license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 size: 1159780 timestamp: 1781859501654 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda @@ -1485,6 +1667,7 @@ packages: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache + run_exports: {} size: 569349 timestamp: 1781670209146 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -1496,6 +1679,9 @@ packages: - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 size: 107691 timestamp: 1738479560845 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda @@ -1507,27 +1693,34 @@ packages: - expat 2.8.1.* license: MIT license_family: MIT + run_exports: {} size: 69362 timestamp: 1781203631990 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 - md5: 43c04d9cb46ef176bb2a4c77e324d599 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda + sha256: 2c6ac9a6cd65af89b2bd448518bb1e13b44a2e48c0d469398e37bcfc0092e832 + md5: 92e8690d170d46d768c32553458c0105 depends: - __osx >=11.0 license: MIT license_family: MIT - size: 40979 - timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e - md5: b1fd823b5ae54fbec272cea0811bd8a9 + run_exports: + weak: + - libffi >=3.7.0,<3.8.0a0 + size: 43734 + timestamp: 1783521647536 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda + sha256: 23d0630046a3e8b164d8f80f2b74ed2605af2e7050ab9913018056402fae4311 + md5: 8ab10323068b107661a4b9a4af84f3b5 depends: - __osx >=11.0 constrains: - xz 5.8.3.* license: 0BSD - size: 92472 - timestamp: 1775825802659 + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 91720 + timestamp: 1786348695846 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 md5: 57c4be259f5e0b99a5983799a228ae55 @@ -1535,6 +1728,7 @@ packages: - __osx >=11.0 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 73690 timestamp: 1769482560514 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda @@ -1543,36 +1737,49 @@ packages: depends: - __osx >=11.0 license: ISC + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 size: 247352 timestamp: 1779164136206 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda - sha256: a73a8acd97a6599fd6e561514db9f101ca7fd984cdc0cfd91ba74c8aa9dbe067 - md5: 7184d95871a58b8258a8ea124ed5aabc +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-h1ae2325_0.conda + sha256: 745662565e103f290e9dc4263bbd88285082f8cf699854fe2d5f1e35a4a0d326 + md5: 0e3477c0c3e718dcf2eb74ccc8f68570 depends: - __osx >=11.0 + - icu >=78.3,<79.0a0 - libzlib >=1.3.2,<2.0a0 license: blessing - size: 924912 - timestamp: 1782519136322 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 - md5: bc5a5721b6439f2f62a84f2548136082 + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 929203 + timestamp: 1785016131414 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + sha256: a18fa5d5bac452401459f966cf0d872224e8080c4ff93c77e168d43ab42ef9d7 + md5: f39288f0ea63ae962e1a2e4f355a0d75 depends: - __osx >=11.0 constrains: - - zlib 1.3.2 *_2 + - zlib 1.3.2 *_3 license: Zlib license_family: Other - size: 47759 - timestamp: 1774072956767 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d - md5: 343d10ed5b44030a2f67193905aea159 + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 47822 + timestamp: 1785277049190 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda + sha256: 7024a48c8c0d0114ed4ab53c76bf9275d50e91ba7cea367a9aead638d3c29c68 + md5: 3dfa0d0316dc246cd44937a557de4501 depends: - __osx >=11.0 license: X11 AND BSD-3-Clause - size: 805509 - timestamp: 1777423252320 + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 804298 + timestamp: 1786355189145 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda noarch: python sha256: ce2cbbab1b433212f3f40c5d8d123c8ea24b1e8cb20abf13b5dc7522c9f7db69 @@ -1586,30 +1793,34 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: {} size: 629436 timestamp: 1782129869826 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda - sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb - md5: 8187a86242741725bfa74785fe812979 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda + sha256: 66be2283b5b37dcda1332b5e74c1782a8cb14fd2e62e0d38017c2d35bf73c119 + md5: 65d1906712b85d1679263c518d011b5b depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 3102584 - timestamp: 1781069820667 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda - build_number: 100 - sha256: 984081c9fae3a3944c6f2707bbbbc70e8b961f02cdb7c640d9745e2636235632 - md5: 4841be3d0cf616a860efc6e60af66f8b + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3109132 + timestamp: 1785913735357 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-hf4d206d_102_cp314.conda + build_number: 102 + sha256: 9767b5eee5cef50716708787bb3b4225d2a974bcd50653e856f9db5910a4b17e + md5: 8da4ea285021110e2617f7538c386afc depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.8.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 + - libffi >=3.7.0,<3.8.0a0 - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 + - libsqlite >=3.53.4,<4.0a0 - libzlib >=1.3.2,<2.0a0 - ncurses >=6.6,<7.0a0 - openssl >=3.5.7,<4.0a0 @@ -1619,8 +1830,13 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 14059371 - timestamp: 1781254578985 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 13960847 + timestamp: 1786444540722 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 @@ -1649,6 +1865,7 @@ packages: - cpython >=3.12 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 191432 timestamp: 1779484184540 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda @@ -1659,20 +1876,25 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + run_exports: + weak: + - readline >=8.3,<9.0a0 size: 313930 timestamp: 1765813902568 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.22-h828de30_0.conda +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.16.2-h828de30_0.conda noarch: python - sha256: 56362f7c5150de1f01450fcb668dbd9c3f163e9f0f69f1f7c9da5bebd0d75172 - md5: 81fe5e5807d471fcd624bfb6bdb98968 + sha256: 8900877bfd18dcb27077a1dd9eaa7230ccae8bd6d7fada9b91c3bfbdf705f808 + md5: 57b0c0a8868a452c34904b01e99f3e45 depends: - python - __osx >=11.0 constrains: - __osx >=11.0 license: MIT - size: 8651168 - timestamp: 1784237480462 + license_family: MIT + run_exports: {} + size: 8732289 + timestamp: 1786152041950 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda sha256: 47186bc7ab8d7e8bee86bbd1a917196f8c21cf63f081fc33cd6d1221af087580 md5: 8e3cf0e455e6b54519f0b1c72c61780a @@ -1680,11 +1902,14 @@ packages: - __osx >=11.0 - libzlib >=1.3.2,<2.0a0 license: TCL + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 size: 3338712 timestamp: 1784229090530 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda - sha256: 1a4f3d940cf239acde2fc61674b7cf80219a7f22a369e92b95b245be2d47caf1 - md5: cc1d84777343f00f01c08a2d9550f639 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.8-py314h6c2aa35_0.conda + sha256: 4af8e4394d249619b4f1641c82fd6c0a8b97d51991ca2986095bed400c2e5eb9 + md5: ab1bd70ec9c95d199f8ce456823004ab depends: - __osx >=11.0 - python >=3.14,<3.15.0a0 @@ -1692,23 +1917,9 @@ packages: - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 915857 - timestamp: 1781007345425 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda - sha256: 033dbf9859fe58fb85350cf6395be6b1346792e1766d2d5acab538a6eb3659fb - md5: e229f444fbdb28d8c4f40e247154d993 - depends: - - __osx >=11.0 - - cffi - - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT run_exports: {} - size: 14884 - timestamp: 1769439056290 + size: 922067 + timestamp: 1786227125229 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac md5: 78a0fe9e9c50d2c381e8ee47e3ea437d @@ -1731,6 +1942,9 @@ packages: - libsodium >=1.0.22,<1.0.23.0a0 license: MPL-2.0 license_family: MOZILLA + run_exports: + weak: + - zeromq >=4.3.5,<4.4.0a0 size: 245404 timestamp: 1779124076307 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda @@ -1741,33 +1955,36 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 size: 433413 timestamp: 1764777166076 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-1.1.0.dev2026081005-release.conda - sha256: 068813780f05908b74446039e3bc076ff858669c289df3758208d50d57e521cf - md5: a4045e3986192990a25c55e7d9097fba +- conda: https://conda.modular.com/max/linux-64/mojo-1.0.0-release.conda + sha256: 5778f999b69cf77bd6f07ccaf32d0bafc258fe75206afc8e88919269cebb6e75 + md5: afeb126acb57602a5f9b8153e75e1c3c depends: - python >=3.10 - - mojo-compiler ==1.1.0.dev2026081005 - - mblack ==26.6.0.dev2026081005 + - mojo-compiler ==1.0.0 + - mblack ==26.5.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary run_exports: {} - size: 116005605 - timestamp: 1786340626272 -- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-1.1.0.dev2026081005-release.conda - sha256: e4910c6d72f9782eba05d548589569eb4bc3f910bb28b637120a397748889b31 - md5: 107388d6679e1c50abd58b315022d6b6 + size: 115641078 + timestamp: 1786292404342 +- conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0-release.conda + sha256: 4394c6146d47ec7794a9a3ed5775ae158f59f83f8e1aed59408b17c4909821b3 + md5: 75d2e2ca9d87fdc76513d7939202e7dc depends: - - mojo-python ==1.1.0.dev2026081005 + - mojo-python ==1.0.0 license: LicenseRef-Modular-Proprietary run_exports: {} - size: 68677291 - timestamp: 1786340630154 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.6.0.dev2026081005-release.conda + size: 68511359 + timestamp: 1786292410712 +- conda: https://conda.modular.com/max/noarch/mblack-26.5.0-release.conda noarch: python - sha256: 5c3ef3e559c54054b5b8caf1c3c1fbc4e206ca612e21e92dbf129720bbd19ebc - md5: d576caede2b60aa8f548f6e6efc48afb + sha256: 49102b55366eab56b04620533302b8693b4fa4a6c5972b3cc978b3f3bad83ebe + md5: 0cbfc119215c063cd279f0a6beb04285 depends: - python >=3.10 - click >=8.0.0 @@ -1778,36 +1995,36 @@ packages: - tomli >=1.1.0 license: LicenseRef-Modular-Proprietary run_exports: {} - size: 137551 - timestamp: 1786340494641 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-1.1.0.dev2026081005-release.conda + size: 137187 + timestamp: 1786151006088 +- conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0-release.conda noarch: python - sha256: c5900f8776cc2bfa74da6d34fa8d3cac98a9ce8183d2a2dc29a5b35d7fb1a630 - md5: b37939bfd36b01fdf46173fd893bcdb3 + sha256: fc449a47c7707ed96a794768e29d5d2b0bf7afab373e2a9751f281ed7c4f822c + md5: 4a27e1596a5c2d27330a2377090b12c5 depends: - python >=3.10 license: LicenseRef-Modular-Proprietary run_exports: {} - size: 24111 - timestamp: 1786340495055 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-1.1.0.dev2026081005-release.conda - sha256: c644e71aaf93f84dee787e470921bec24029fb3e95f9f4ccf4b7d492fe8e1453 - md5: 62d22e5ab8b019dbe1efd55dc8756bac + size: 24040 + timestamp: 1785891558838 +- conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0-release.conda + sha256: 200bd9ace6e06ad2a9b4f4cce9afa3e5f3c00b3d87a6d57206249df2a5568e38 + md5: 954433eb905b424cc3d4325c9c2242de depends: - python >=3.10 - - mojo-compiler ==1.1.0.dev2026081005 - - mblack ==26.6.0.dev2026081005 + - mojo-compiler ==1.0.0 + - mblack ==26.5.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary run_exports: {} - size: 101496142 - timestamp: 1786340896112 -- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-1.1.0.dev2026081005-release.conda - sha256: 0edf32fc5b430e4c1630710066238dcb6046863368735170b254da944aec37e4 - md5: 62df8911d4f311000dbb39624a610c9c + size: 101155040 + timestamp: 1786294689438 +- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0-release.conda + sha256: c52054bc444d851e5c38cc33e790fb011a1080470244aaa59351ac5056d08c59 + md5: b5103c9d9978173a1e97c5e5eed1aeba depends: - - mojo-python ==1.1.0.dev2026081005 + - mojo-python ==1.0.0 license: LicenseRef-Modular-Proprietary run_exports: {} - size: 61386190 - timestamp: 1786340891348 + size: 61221085 + timestamp: 1786294690001 diff --git a/pixi.toml b/pixi.toml index 57e0810b..7bd3e604 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,6 +1,6 @@ [workspace] authors = ["ZHU Yuhao (朱宇浩) "] -channels = ["https://conda.modular.com/max-nightly", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "conda-forge"] +channels = ["https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "conda-forge"] description = "An arbitrary-precision decimal and integer library for Mojo" license = "Apache-2.0" name = "decimo" @@ -10,7 +10,7 @@ version = "0.11.0" [dependencies] # argmojo = ">=0.7,<0.8" # CLI argument parsing for the Decimo calculator -mojo = "*" # Mojo language compiler and runtime +mojo = ">=1.0.0,<1.1.0" # Mojo language compiler and runtime python = ">=3.13" # For Python bindings and tests python-build = ">=0.2.0" # Build PyPI wheel (`pixi run wheel`) ruff = ">=0.15.0" # Python code formatter @@ -19,12 +19,13 @@ pre-commit = ">=4.6.1,<5" [tasks] # format the code -format = """pixi run mojo format ./src \ -&&pixi run mojo format ./python \ -&&pixi run mojo format ./benches \ -&&pixi run mojo format ./tests \ -&&pixi run mojo format ./docs \ -&&pixi run ruff format ./python""" +format = """pixi run clean \ +&& pixi run mojo format ./src \ +&& pixi run mojo format ./python \ +&& pixi run mojo format ./benches \ +&& pixi run mojo format ./tests \ +&& pixi run mojo format ./docs \ +&& pixi run ruff format ./python""" # doc # Note: the CLI calculator doc step uses `-I tests` (the prebuilt diff --git a/src/decimo/bigdecimal/bigdecimal.mojo b/src/decimo/bigdecimal/bigdecimal.mojo index 2942066e..38c7c4a4 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -219,26 +219,6 @@ struct BigDecimal( # The string is normalized with `decimo.str.parse_numeric_string()`. self = Self.from_string(value) - @implicit - def __init__(out self, value: Int): - """Constructs a BigDecimal from an `Int` object. - See `from_int()` for more information. - - Args: - value: The integer to convert. - """ - self = Self.from_int(value) - - @implicit - def __init__(out self, value: UInt): - """Constructs a BigDecimal from an `UInt` object. - See `from_uint()` for more information. - - Args: - value: The unsigned integer to convert. - """ - self = Self.from_uint(value) - @implicit def __init__[dtype: DType, //](out self, value: SIMD[dtype, 1]): """Constructs a BigDecimal from an integral scalar. @@ -279,8 +259,8 @@ struct BigDecimal( # ===------------------------------------------------------------------=== # # Constructing methods that are not dunders - # from_int(value: Int) -> Self - # from_scalar(value: Scalar) -> Self + # from_integral_scalar[dtype: DType](value: Scalar[dtype]) -> Self + # from_float[dtype: DType](value: Scalar[dtype]) -> Self # from_string(value: String) -> Self # ===------------------------------------------------------------------=== # @@ -325,64 +305,6 @@ struct BigDecimal( """ return Self(BigUInt(raw_words=[word]), scale, sign) - @staticmethod - def from_int(value: Int) -> Self: - """Creates a BigDecimal from an integer. - - Args: - value: The integer to convert. - - Returns: - A `BigDecimal` representing the given integer. - """ - if value == 0: - return Self(coefficient=BigUInt.zero(), scale=0, sign=False) - - var words = List[UInt32](capacity=2) - var sign: Bool - var remainder: Int - var quotient: Int - var is_min: Bool = False - if value < 0: - sign = True - # Handle the case of Int.MIN due to asymmetry of Int.MIN and Int.MAX - if value == Int.MIN: - is_min = True - remainder = Int.MAX - else: - remainder = -value - else: - sign = False - remainder = value - - while remainder != 0: - quotient = remainder // 1_000_000_000 - remainder = remainder % 1_000_000_000 - words.append(UInt32(remainder)) - remainder = quotient - - if is_min: - words[0] += 1 - - return Self(coefficient=BigUInt(raw_words=words^), scale=0, sign=sign) - - # TODO: This method is no longer needed as UInt is now an alias for SIMD. - @staticmethod - def from_uint(value: UInt) -> Self: - """Creates a BigDecimal from an unsigned integer. - - Args: - value: The unsigned integer to convert. - - Returns: - A `BigDecimal` representing the given unsigned integer. - """ - return Self( - coefficient=BigUInt.from_unsigned_integral_scalar(value), - scale=0, - sign=False, - ) - @staticmethod def from_integral_scalar[dtype: DType, //](value: SIMD[dtype, 1]) -> Self: """Initializes a BigDecimal from an integral scalar. diff --git a/src/decimo/bigdecimal/exponential.mojo b/src/decimo/bigdecimal/exponential.mojo index 44d37621..d80c7e16 100644 --- a/src/decimo/bigdecimal/exponential.mojo +++ b/src/decimo/bigdecimal/exponential.mojo @@ -692,8 +692,8 @@ def integer_root( var r = BigDecimal(String(guess_f64)) # BigDecimal constants - var n_bd = BigDecimal.from_int(n_int) - var n_minus_1_bd = BigDecimal.from_int(n_int - 1) + var n_bd = BigDecimal.from_integral_scalar(n_int) + var n_minus_1_bd = BigDecimal.from_integral_scalar(n_int - 1) var n_minus_1_int = n_int - 1 # Newton's method with precision doubling @@ -1697,7 +1697,7 @@ def sqrt_decimal_approach(x: BigDecimal, precision: Int) raises -> BigDecimal: if odd_ndigits_frac_part: value = value * UInt128(10) var sqrt_value = decimal128_utility.sqrt(value) - var sqrt_value_biguint = BigUInt.from_unsigned_integral_scalar(sqrt_value) + var sqrt_value_biguint = BigUInt.from_integral_scalar(sqrt_value) guess = BigDecimal( sqrt_value_biguint, sqrt_value_biguint.number_of_digits() - ndigits_int_part_sqrt, @@ -2095,12 +2095,14 @@ def ln( if combined_ln2_factor != 0: var ln2 = cache.get_ln2(working_precision) result.add_inplace( - ln2.multiply(BigDecimal.from_int(combined_ln2_factor)) + ln2.multiply(BigDecimal.from_integral_scalar(combined_ln2_factor)) ) if combined_ln1d25_factor != 0: var ln1d25 = cache.get_ln1d25(working_precision) result.add_inplace( - ln1d25.multiply(BigDecimal.from_int(combined_ln1d25_factor)) + ln1d25.multiply( + BigDecimal.from_integral_scalar(combined_ln1d25_factor) + ) ) # Round to final precision @@ -2215,7 +2217,7 @@ def log10(x: BigDecimal, precision: Int) raises -> BigDecimal: if x.coefficient.is_power_of_10(): # If x = 10^n, return n var power = x.coefficient.number_of_trailing_zeros() - x.scale - return BigDecimal.from_int(power) + return BigDecimal.from_integral_scalar(power) # Special case for x = 1 if ( diff --git a/src/decimo/bigint/arithmetics.mojo b/src/decimo/bigint/arithmetics.mojo index f7ebff65..2ab63ace 100644 --- a/src/decimo/bigint/arithmetics.mojo +++ b/src/decimo/bigint/arithmetics.mojo @@ -33,6 +33,7 @@ Algorithms: (< CUTOFF_BURNIKEL_ZIEGLER words). Single-word fast path for UInt32 divisors. """ +from std.bit import count_leading_zeros from std.memory import unsafe_memcpy, unsafe_memset_zero from decimo.bigint.bigint import BigInt @@ -45,10 +46,6 @@ from decimo.errors import ValueError, ZeroDivisionError comptime CUTOFF_KARATSUBA: Int = 48 """The minimum number of words above which Karatsuba multiplication is used.""" -# SIMD vector width: 4 x UInt32 = 128-bit, supported natively on arm64 NEON. -comptime VECTOR_WIDTH: Int = 4 -"""The SIMD vector width used for vectorized operations.""" - # Burnikel-Ziegler cutoff: divisors with this many words or fewer use # Knuth D (schoolbook). Must be even for the recursive halving to work. comptime CUTOFF_BURNIKEL_ZIEGLER: Int = 64 @@ -123,45 +120,6 @@ def _add_magnitudes(a: List[UInt32], b: UInt32) -> List[UInt32]: return result^ -def _add_magnitudes_into( - mut result: List[UInt32], - imm a: List[UInt32], - a_start: Int, - a_end: Int, - imm b: List[UInt32], - b_start: Int, - b_end: Int, -): - """Adds two magnitude slices directly into result, avoiding allocation. - - This is the core addition primitive used by Karatsuba. - Operates on sub-ranges of a and b without copying. - - Args: - result: Output list (must be pre-allocated to at least max(a_len, b_len) + 1). - a: First magnitude. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). - b: Second magnitude. - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). - """ - var len_a = a_end - a_start - var len_b = b_end - b_start - var len_max = max(len_a, len_b) - - var carry: UInt64 = 0 - for i in range(len_max): - var ai: UInt64 = UInt64(a[a_start + i]) if i < len_a else 0 - var bi: UInt64 = UInt64(b[b_start + i]) if i < len_b else 0 - var s = ai + bi + carry - result[i] = UInt32(s & 0xFFFF_FFFF) - carry = s >> 32 - - if carry > 0: - result[len_max] = UInt32(carry) - - def _subtract_magnitudes(a: List[UInt32], b: List[UInt32]) -> List[UInt32]: """Subtracts magnitude b from magnitude a, assuming |a| >= |b|. @@ -228,27 +186,25 @@ def _multiply_magnitudes(a: List[UInt32], b: List[UInt32]) -> List[UInt32]: return zero^ if len_a == 1: - return _multiply_magnitude_by_word(b, 0, len_b, a[0]) + return _multiply_magnitude_by_word(b, a[0]) if len_b == 1: - return _multiply_magnitude_by_word(a, 0, len_a, b[0]) + return _multiply_magnitude_by_word(a, b[0]) # Dispatch based on size var len_max = max(len_a, len_b) if len_max <= CUTOFF_KARATSUBA: - return _multiply_magnitudes_schoolbook(a, 0, len_a, b, 0, len_b) + return _multiply_magnitudes_schoolbook(a, b) else: - return _multiply_magnitudes_karatsuba(a, 0, len_a, b, 0, len_b) + return _multiply_magnitudes_karatsuba(a, b) def _multiply_magnitude_by_word( - imm a: List[UInt32], a_start: Int, a_end: Int, w: UInt32 + a: ImmSpan[UInt32, _], w: UInt32 ) -> List[UInt32]: """Multiplies a magnitude slice by a single UInt32 word. Args: a: The magnitude. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). w: The single-word multiplier. Returns: @@ -258,18 +214,18 @@ def _multiply_magnitude_by_word( var zero: List[UInt32] = [UInt32(0)] return zero^ if w == 1: - var result = List[UInt32](capacity=a_end - a_start) - for i in range(a_start, a_end): + var result = List[UInt32](capacity=len(a)) + for i in range(len(a)): result.append(a[i]) return result^ - var len_a = a_end - a_start + var len_a = len(a) var result = List[UInt32](capacity=len_a + 1) result.resize(unsafe_uninit_length=len_a + 1) var carry: UInt64 = 0 var w64 = UInt64(w) - var ap = a._data.unsafe_offset(a_start) + var ap = a.unsafe_ptr() var rp = result._data for i in range(len_a): var product = UInt64(ap[unsafe_offset=i]) * w64 + carry @@ -288,31 +244,22 @@ def _multiply_magnitude_by_word( def _multiply_magnitudes_schoolbook( - imm a: List[UInt32], - a_start: Int, - a_end: Int, - imm b: List[UInt32], - b_start: Int, - b_end: Int, + a: ImmSpan[UInt32, _], b: ImmSpan[UInt32, _] ) -> List[UInt32]: """Schoolbook multiplication on magnitude slices. - Operates on sub-ranges [a_start, a_end) and [b_start, b_end) without - copying the input data. Uses UInt64 for intermediate products. + Operates on borrowed views of the operands without copying the input + data. Uses UInt64 for intermediate products. Args: a: First magnitude. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). b: Second magnitude. - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). Returns: The product magnitude as a new word list. """ - var len_a = a_end - a_start - var len_b = b_end - b_start + var len_a = len(a) + var len_b = len(b) if len_a == 0 or len_b == 0: var zero: List[UInt32] = [UInt32(0)] @@ -325,12 +272,12 @@ def _multiply_magnitudes_schoolbook( unsafe_memset_zero(ptr=result._data, count=result_len) for i in range(len_a): - var ai = UInt64(a[a_start + i]) + var ai = UInt64(a[i]) if ai == 0: continue var carry: UInt64 = 0 var rp = result._data.unsafe_offset(i) - var bp = b._data.unsafe_offset(b_start) + var bp = b.unsafe_ptr() for j in range(len_b): var product = ( ai * UInt64(bp[unsafe_offset=j]) @@ -352,12 +299,7 @@ def _multiply_magnitudes_schoolbook( def _multiply_magnitudes_karatsuba( - imm a: List[UInt32], - a_start: Int, - a_end: Int, - imm b: List[UInt32], - b_start: Int, - b_end: Int, + a: ImmSpan[UInt32, _], b: ImmSpan[UInt32, _] ) -> List[UInt32]: """Karatsuba multiplication on magnitude slices. @@ -371,37 +313,31 @@ def _multiply_magnitudes_karatsuba( In base-2^32, B^m shift = prepending m zero words (memcpy + memset_zero). - Operates on sub-ranges to avoid copying the original input data. + Operates on borrowed views to avoid copying the original input data. Falls back to schoolbook for small operands. Args: a: First magnitude. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). b: Second magnitude. - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). Returns: The product magnitude as a new word list. """ - var len_a = a_end - a_start - var len_b = b_end - b_start + var len_a = len(a) + var len_b = len(b) # Base case: fall back to schoolbook if len_a == 0 or len_b == 0: var zero: List[UInt32] = [UInt32(0)] return zero^ if len_a == 1: - return _multiply_magnitude_by_word(b, b_start, b_end, a[a_start]) + return _multiply_magnitude_by_word(b, a[0]) if len_b == 1: - return _multiply_magnitude_by_word(a, a_start, a_end, b[b_start]) + return _multiply_magnitude_by_word(a, b[0]) var len_max = max(len_a, len_b) if len_max <= CUTOFF_KARATSUBA: - return _multiply_magnitudes_schoolbook( - a, a_start, a_end, b, b_start, b_end - ) + return _multiply_magnitudes_schoolbook(a, b) # Split point: half of the larger operand var m = len_max // 2 @@ -409,12 +345,8 @@ def _multiply_magnitudes_karatsuba( # Case 1: a is shorter than m — split only b if len_a <= m: # a × b = a × b_low + (a × b_high) * B^m - var z0 = _multiply_magnitudes_karatsuba( - a, a_start, a_end, b, b_start, b_start + m - ) - var z1 = _multiply_magnitudes_karatsuba( - a, a_start, a_end, b, b_start + m, b_end - ) + var z0 = _multiply_magnitudes_karatsuba(a, b[:m]) + var z1 = _multiply_magnitudes_karatsuba(a, b[m:]) # Allocate result, add z0 at offset 0, z1 at offset m var rlen = len_a + len_b var result = List[UInt32](capacity=rlen) @@ -430,12 +362,8 @@ def _multiply_magnitudes_karatsuba( # Case 2: b is shorter than m — split only a if len_b <= m: - var z0 = _multiply_magnitudes_karatsuba( - a, a_start, a_start + m, b, b_start, b_end - ) - var z1 = _multiply_magnitudes_karatsuba( - a, a_start + m, a_end, b, b_start, b_end - ) + var z0 = _multiply_magnitudes_karatsuba(a[:m], b) + var z1 = _multiply_magnitudes_karatsuba(a[m:], b) var rlen = len_a + len_b var result = List[UInt32](capacity=rlen) result.resize(unsafe_uninit_length=rlen) @@ -450,28 +378,17 @@ def _multiply_magnitudes_karatsuba( # Case 3: Normal Karatsuba — both operands split at m # x = x1 * B^m + x0, y = y1 * B^m + y0 - var a_mid = a_start + m - var b_mid = b_start + m # z0 = x0 * y0 - var z0 = _multiply_magnitudes_karatsuba( - a, a_start, a_mid, b, b_start, b_mid - ) + var z0 = _multiply_magnitudes_karatsuba(a[:m], b[:m]) # z2 = x1 * y1 - var z2 = _multiply_magnitudes_karatsuba(a, a_mid, a_end, b, b_mid, b_end) + var z2 = _multiply_magnitudes_karatsuba(a[m:], b[m:]) # z1 = (x0 + x1) * (y0 + y1) - z0 - z2 - var x0_plus_x1 = _add_slices(a, a_start, a_mid, a, a_mid, a_end) - var y0_plus_y1 = _add_slices(b, b_start, b_mid, b, b_mid, b_end) - var z1 = _multiply_magnitudes_karatsuba( - x0_plus_x1, - 0, - len(x0_plus_x1), - y0_plus_y1, - 0, - len(y0_plus_y1), - ) + var x0_plus_x1 = _add_slices(a[:m], a[m:]) + var y0_plus_y1 = _add_slices(b[:m], b[m:]) + var z1 = _multiply_magnitudes_karatsuba(x0_plus_x1, y0_plus_y1) # z1 = z1 - z2 - z0 (z1 >= z2 + z0 by construction) _subtract_magnitudes_inplace(z1, z2) @@ -505,14 +422,7 @@ def _multiply_magnitudes_karatsuba( # ===----------------------------------------------------------------------=== # -def _add_slices( - imm a: List[UInt32], - a_start: Int, - a_end: Int, - imm b: List[UInt32], - b_start: Int, - b_end: Int, -) -> List[UInt32]: +def _add_slices(a: ImmSpan[UInt32, _], b: ImmSpan[UInt32, _]) -> List[UInt32]: """Adds two magnitude slices, returning a new word list. Used by Karatsuba to compute (x0 + x1) and (y0 + y1) without copying @@ -520,25 +430,21 @@ def _add_slices( Args: a: First magnitude. - a_start: Start index in a. - a_end: End index in a. b: Second magnitude. - b_start: Start index in b. - b_end: End index in b. Returns: The sum as a new word list. """ - var len_a = a_end - a_start - var len_b = b_end - b_start + var len_a = len(a) + var len_b = len(b) var len_max = max(len_a, len_b) var result = List[UInt32](capacity=len_max + 1) result.resize(unsafe_uninit_length=len_max + 1) result[len_max] = UInt32(0) var carry: UInt64 = 0 - var ap = a._data.unsafe_offset(a_start) - var bp = b._data.unsafe_offset(b_start) + var ap = a.unsafe_ptr() + var bp = b.unsafe_ptr() var rp = result._data for i in range(len_max): var ai: UInt64 = UInt64(ap[unsafe_offset=i]) if i < len_a else 0 @@ -939,25 +845,9 @@ def _count_leading_zeros(word: UInt32) -> Int: Returns: The number of leading zero bits (0-32). """ - if word == 0: - return 32 - var count = 0 - var w = word - if (w & 0xFFFF0000) == 0: - count += 16 - w <<= 16 - if (w & 0xFF000000) == 0: - count += 8 - w <<= 8 - if (w & 0xF0000000) == 0: - count += 4 - w <<= 4 - if (w & 0xC0000000) == 0: - count += 2 - w <<= 2 - if (w & 0x80000000) == 0: - count += 1 - return count + # `std.bit.count_leading_zeros` lowers to a single hardware `clz` + # instruction, and already returns 32 for a zero input. + return Int(count_leading_zeros(word)) def _shift_left_words(a: List[UInt32], shift: Int) -> List[UInt32]: @@ -1042,71 +932,84 @@ def _shift_right_words( # ===----------------------------------------------------------------------=== # -def _get_words_slice(a: List[UInt32], start: Int, end: Int) -> List[UInt32]: - """Extracts a sub-range of words from a magnitude as a new list. +def _subspan[ + origin: ImmOrigin, // +](s: ImmSpan[UInt32, origin], start: Int, end: Int) -> ImmSpan[UInt32, origin]: + """Returns `s[start:end]`, clamped to the bounds of `s`. - Returns words[start:end], stripping leading zeros. If the range is - empty or fully out of bounds, returns [0]. + The Burnikel-Ziegler recursion routinely computes block bounds that run + past the end of a padded operand, and treats the missing high words as + implicit zeros. This helper reproduces that: `end` is clamped to + `len(s)`, and a start at or past the clamped end yields an empty span. + + Parameters: + origin: The origin of the source span. Args: - a: The source magnitude (little-endian UInt32 words). + s: The span to take a sub-range of. start: Start index (inclusive). - end: End index (exclusive). + end: End index (exclusive), clamped to `len(s)`. Returns: - A new word list containing the specified range, normalized. + The clamped sub-span, possibly empty. """ - var actual_end = min(end, len(a)) + var actual_end = min(end, len(s)) if start >= actual_end: + return s[0:0] + return s[start:actual_end] + + +def _normalized_copy(a: ImmSpan[UInt32, _]) -> List[UInt32]: + """Copies a magnitude slice into a new list, stripping leading zeros. + + Returns [0] for an empty slice. + + Args: + a: The source magnitude (little-endian UInt32 words). + + Returns: + A new word list containing the slice, normalized. + """ + var len_slice = len(a) + if len_slice == 0: var zero: List[UInt32] = [UInt32(0)] return zero^ - var len_slice = actual_end - start var result = List[UInt32](capacity=len_slice) result.resize(unsafe_uninit_length=len_slice) - unsafe_memcpy( - dest=result._data, src=a._data.unsafe_offset(start), count=len_slice - ) + unsafe_memcpy(dest=result._data, src=a.unsafe_ptr(), count=len_slice) # Strip leading zeros while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) return result^ -def _is_zero_in_range(a: List[UInt32], start: Int, end: Int) -> Bool: - """Checks if all words in a[start:end] are zero. +def _is_zero_slice(a: ImmSpan[UInt32, _]) -> Bool: + """Checks whether every word in a magnitude slice is zero. Args: - a: The word list. - start: Start index (inclusive). - end: End index (exclusive). + a: The word slice. Returns: - True if the range is empty or all zeros. + True if the slice is empty or all zeros. """ - var actual_end = min(end, len(a)) - for i in range(start, actual_end): + for i in range(len(a)): if a[i] != 0: return False return True -def _add_from_slice_inplace( - mut a: List[UInt32], imm b: List[UInt32], b_start: Int, b_end: Int -): - """Adds b[b_start:b_end] into a in-place: a += b[b_start:b_end]. +def _add_from_slice_inplace(mut a: List[UInt32], b: ImmSpan[UInt32, _]): + """Adds a magnitude slice into a in-place: a += b. - Grows a if needed. Handles b_start >= b_end as a no-op. + Grows a if needed. An empty b is a no-op. Args: a: The accumulator (modified in-place). - b: The source list. - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). + b: The source slice. """ - var actual_end = min(b_end, len(b)) - if b_start >= actual_end: + var len_b_slice = len(b) + if len_b_slice == 0: return - var len_b_slice = actual_end - b_start var len_a = len(a) var len_max = max(len_a, len_b_slice) @@ -1119,7 +1022,7 @@ def _add_from_slice_inplace( var carry: UInt64 = 0 for i in range(len_max): var ai: UInt64 = UInt64(a[i]) if i < len_a else 0 - var bi: UInt64 = UInt64(b[b_start + i]) if i < len_b_slice else 0 + var bi: UInt64 = UInt64(b[i]) if i < len_b_slice else 0 var s = ai + bi + carry a[i] = UInt32(s & 0xFFFF_FFFF) carry = s >> 32 @@ -1138,41 +1041,30 @@ def _add_from_slice_inplace( def _multiply_magnitudes_slices( - imm a: List[UInt32], - a_start: Int, - a_end: Int, - imm b: List[UInt32], - b_start: Int, - b_end: Int, + a: ImmSpan[UInt32, _], b: ImmSpan[UInt32, _] ) -> List[UInt32]: """Multiplies two magnitude slices, dispatching to the best algorithm. Args: a: First magnitude. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). b: Second magnitude. - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). Returns: The product magnitude as a new word list. """ - var len_a = a_end - a_start - var len_b = b_end - b_start + var len_a = len(a) + var len_b = len(b) if len_a <= 0 or len_b <= 0: var zero: List[UInt32] = [UInt32(0)] return zero^ if len_a == 1: - return _multiply_magnitude_by_word(b, b_start, b_end, a[a_start]) + return _multiply_magnitude_by_word(b, a[0]) if len_b == 1: - return _multiply_magnitude_by_word(a, a_start, a_end, b[b_start]) + return _multiply_magnitude_by_word(a, b[0]) var len_max = max(len_a, len_b) if len_max <= CUTOFF_KARATSUBA: - return _multiply_magnitudes_schoolbook( - a, a_start, a_end, b, b_start, b_end - ) - return _multiply_magnitudes_karatsuba(a, a_start, a_end, b, b_start, b_end) + return _multiply_magnitudes_schoolbook(a, b) + return _multiply_magnitudes_karatsuba(a, b) def _decrement_inplace(mut a: List[UInt32]): @@ -1185,12 +1077,8 @@ def _decrement_inplace(mut a: List[UInt32]): def _divmod_knuth_d_from_slices( - imm a: List[UInt32], - a_start: Int, - a_end: Int, - imm b: List[UInt32], - b_start: Int, - b_end: Int, + a: ImmSpan[UInt32, _], + b: ImmSpan[UInt32, _], ) raises -> Tuple[List[UInt32], List[UInt32]]: """Knuth Algorithm D operating directly on pre-normalized slices. @@ -1199,26 +1087,19 @@ def _divmod_knuth_d_from_slices( Copies each slice exactly once (vs 2-3 copies in the general path). Args: - a: Dividend word list (pre-normalized). - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). - b: Divisor word list (pre-normalized, MSB of top word set). - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). + a: Dividend slice (pre-normalized). + b: Divisor slice (pre-normalized, MSB of top word set). Returns: A tuple of (quotient_words, remainder_words), both normalized. """ - # Effective lengths after stripping trailing zeros - var actual_a_end = min(a_end, len(a)) - while actual_a_end > a_start and a[actual_a_end - 1] == 0: - actual_a_end -= 1 - var actual_b_end = min(b_end, len(b)) - while actual_b_end > b_start and b[actual_b_end - 1] == 0: - actual_b_end -= 1 - - var len_a_eff = actual_a_end - a_start - var len_b_eff = actual_b_end - b_start + # Effective lengths after stripping leading zero words + var len_a_eff = len(a) + while len_a_eff > 0 and a[len_a_eff - 1] == 0: + len_a_eff -= 1 + var len_b_eff = len(b) + while len_b_eff > 0 and b[len_b_eff - 1] == 0: + len_b_eff -= 1 if len_a_eff <= 0: return ([UInt32(0)], [UInt32(0)]) @@ -1230,8 +1111,8 @@ def _divmod_knuth_d_from_slices( # Single-word divisor fast path if len_b_eff == 1: - var a_slice = _get_words_slice(a, a_start, actual_a_end) - var result = _divmod_single_word(a_slice, b[b_start]) + var a_slice = _normalized_copy(a[:len_a_eff]) + var result = _divmod_single_word(a_slice, b[0]) var q = result[0].copy() var r_word = result[1] var r_words: List[UInt32] = [r_word] @@ -1240,14 +1121,14 @@ def _divmod_knuth_d_from_slices( # Compare magnitudes var cmp_len_diff = len_a_eff - len_b_eff if cmp_len_diff < 0: - var rem = _get_words_slice(a, a_start, actual_a_end) + var rem = _normalized_copy(a[:len_a_eff]) return ([UInt32(0)], rem^) if cmp_len_diff == 0: # Same length — compare words from top var cmp = 0 for i in range(len_a_eff - 1, -1, -1): - var wa = a[a_start + i] - var wb = b[b_start + i] + var wa = a[i] + var wb = b[i] if wa > wb: cmp = 1 break @@ -1255,7 +1136,7 @@ def _divmod_knuth_d_from_slices( cmp = -1 break if cmp < 0: - var rem = _get_words_slice(a, a_start, actual_a_end) + var rem = _normalized_copy(a[:len_a_eff]) return ([UInt32(0)], rem^) if cmp == 0: return ([UInt32(1)], [UInt32(0)]) @@ -1265,9 +1146,7 @@ def _divmod_knuth_d_from_slices( var m = len_a_eff - n var u = List[UInt32](capacity=len_a_eff + 1) u.resize(unsafe_uninit_length=len_a_eff) - unsafe_memcpy( - dest=u._data, src=a._data.unsafe_offset(a_start), count=len_a_eff - ) + unsafe_memcpy(dest=u._data, src=a.unsafe_ptr(), count=len_a_eff) # Ensure u has an extra leading word if len(u) <= m + n: u.append(UInt32(0)) @@ -1277,8 +1156,8 @@ def _divmod_knuth_d_from_slices( unsafe_memset_zero(ptr=quotient._data, count=m + 1) # v_n_minus_1 and v_n_minus_2 read directly from b via offset - var v_n_minus_1 = UInt64(b[b_start + n - 1]) - var v_n_minus_2 = UInt64(b[b_start + n - 2]) if n >= 2 else UInt64(0) + var v_n_minus_1 = UInt64(b[n - 1]) + var v_n_minus_2 = UInt64(b[n - 2]) if n >= 2 else UInt64(0) # Knuth D main loop for j in range(m, -1, -1): @@ -1308,7 +1187,7 @@ def _divmod_knuth_d_from_slices( # Multiply and subtract: u[j..j+n] -= q_hat * v[0..n-1] var carry: UInt64 = 0 for i in range(n): - var prod = q_hat * UInt64(b[b_start + i]) + carry + var prod = q_hat * UInt64(b[i]) + carry var prod_lo = UInt32(prod & 0xFFFF_FFFF) carry = prod >> 32 var idx = j + i @@ -1331,9 +1210,7 @@ def _divmod_knuth_d_from_slices( # Add back: u[j..j+n-1] += v var add_carry: UInt64 = 0 for i in range(n): - var s = ( - UInt64(u[j + i]) + UInt64(b[b_start + i]) + add_carry - ) + var s = UInt64(u[j + i]) + UInt64(b[i]) + add_carry u[j + i] = UInt32(s & 0xFFFF_FFFF) add_carry = s >> 32 if jn < len(u): @@ -1425,12 +1302,8 @@ def _divmod_burnikel_ziegler( # First iteration: divide top 2n words by norm_b. var result_pair = _bz_two_by_one_slices( - norm_a, - norm_b, - (t - 2) * n, - t * n, - 0, - n, + _subspan(norm_a, (t - 2) * n, t * n), + _subspan(norm_b, 0, n), n, block_size, ) @@ -1444,18 +1317,11 @@ def _divmod_burnikel_ziegler( for i in range(t - 3, -1, -1): # z = z * B^n + block[i] _shift_left_words_inplace(z, n) - _add_from_slice_inplace(z, norm_a, i * n, (i + 1) * n) + _add_from_slice_inplace(z, _subspan(norm_a, i * n, (i + 1) * n)) # Divide z by norm_b (slice-based) result_pair = _bz_two_by_one_slices( - z, - norm_b, - 0, - len(z), - 0, - n, - n, - block_size, + z, _subspan(norm_b, 0, n), n, block_size ) var q_i = result_pair[0].copy() z = result_pair[1].copy() @@ -1466,7 +1332,7 @@ def _divmod_burnikel_ziegler( # STEP 5: Un-normalize the remainder. var remainder: List[UInt32] if word_pad > 0: - var r_stripped = _get_words_slice(z, word_pad, len(z)) + var r_stripped = _normalized_copy(_subspan(z, word_pad, len(z))) remainder = _shift_right_words(r_stripped, bit_shift, len(r_stripped)) else: remainder = _shift_right_words(z, bit_shift, len(z)) @@ -1481,27 +1347,19 @@ def _divmod_burnikel_ziegler( def _bz_two_by_one_slices( - a: List[UInt32], - b: List[UInt32], - a_start: Int, - a_end: Int, - b_start: Int, - b_end: Int, + a: ImmSpan[UInt32, _], + b: ImmSpan[UInt32, _], n: Int, cutoff: Int, ) raises -> Tuple[List[UInt32], List[UInt32]]: - """Divides a[a_start:a_end] (at most 2n words) by b[b_start:b_end] (n words). + """Divides a (at most 2n words) by b (n words). - Slice-based: a and b are not copied until the base case. + Slice-based: a and b are borrowed views, not copied until the base case. Recursively splits into two 3-by-2 sub-problems. Args: - a: The dividend word list. - b: The divisor word list. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). + a: The dividend slice. + b: The divisor slice. n: Block size (number of words in the divisor slice). cutoff: Threshold for fallback to schoolbook. @@ -1511,35 +1369,26 @@ def _bz_two_by_one_slices( # Base case: use prenormalized Knuth D directly on slices (avoids # redundant normalization and reduces copies from 5 to 1). if (n & 1 == 1) or (n <= cutoff): - return _divmod_knuth_d_from_slices(a, a_start, a_end, b, b_start, b_end) + return _divmod_knuth_d_from_slices(a, b) var half = n // 2 # If a3 (top quarter, words n+half..2n) is zero or empty, the dividend # fits in 3*half words — use a single 3-by-2 division directly. - if a_end <= a_start + n + half or _is_zero_in_range( - a, a_start + n + half, a_end - ): - return _bz_three_by_two_slices( - a, b, a_start, a_end, b_start, b_end, half, cutoff - ) + if len(a) <= n + half or _is_zero_slice(a[n + half :]): + return _bz_three_by_two_slices(a, b, half, cutoff) - # First 3-by-2: divide a[a_start+half : a_end] (= a3a2a1, 3*half words) - # by b[b_start:b_end] (= b1b0, 2*half words). - var result1 = _bz_three_by_two_slices( - a, b, a_start + half, a_end, b_start, b_end, half, cutoff - ) + # First 3-by-2: divide a[half:] (= a3a2a1, 3*half words) + # by b (= b1b0, 2*half words). + var result1 = _bz_three_by_two_slices(a[half:], b, half, cutoff) var q1 = result1[0].copy() var r = result1[1].copy() - # Second 3-by-2: divide (r * B^half + a0) by b. - # where a0 = a[a_start : a_start+half] + # Second 3-by-2: divide (r * B^half + a0) by b, where a0 = a[:half] _shift_left_words_inplace(r, half) - _add_from_slice_inplace(r, a, a_start, min(a_start + half, a_end)) + _add_from_slice_inplace(r, _subspan(a, 0, half)) - var result2 = _bz_three_by_two_slices( - r, b, 0, len(r), b_start, b_end, half, cutoff - ) + var result2 = _bz_three_by_two_slices(r, b, half, cutoff) var q0 = result2[0].copy() var s = result2[1].copy() @@ -1551,71 +1400,59 @@ def _bz_two_by_one_slices( def _bz_three_by_two_slices( - a: List[UInt32], - b: List[UInt32], - a_start: Int, - a_end: Int, - b_start: Int, - b_end: Int, + a: ImmSpan[UInt32, _], + b: ImmSpan[UInt32, _], n: Int, cutoff: Int, ) raises -> Tuple[List[UInt32], List[UInt32]]: """Divides a 3n-word slice by a 2n-word slice. - a[a_start:a_end] = a2 * B^(2n) + a1 * B^n + a0 (at most 3n words) - b[b_start:b_end] = b1 * B^n + b0 (2n words) + a = a2 * B^(2n) + a1 * B^n + a0 (at most 3n words) + b = b1 * B^n + b0 (2n words) Uses one 2n-by-n division and one n-by-n multiplication. The correction loop (at most 2 iterations) ensures the remainder is non-negative. Args: - a: Dividend word list. - b: Divisor word list. - a_start: Start index in a (inclusive). - a_end: End index in a (exclusive). - b_start: Start index in b (inclusive). - b_end: End index in b (exclusive). + a: Dividend slice. + b: Divisor slice. n: Block size (number of words in each sub-part). cutoff: Threshold for fallback to schoolbook. Returns: A tuple of (quotient_words, remainder_words). """ - # Bounds for sub-parts (no data copying here, just index arithmetic) - var b1_start = b_start + n - var b1_end = b_end - var b0_start = b_start - var b0_end = min(b_start + n, b_end) - var a0_start = a_start - var a0_end = min(a_start + n, a_end) - var a2a1_start = a_start + n - var a2a1_end = a_end + # Sub-part views (no data copying here, just pointer/length arithmetic). + # The high parts may run past the end of a short operand, in which case + # the missing words are implicitly zero — hence `_subspan`. + var b1 = _subspan(b, n, len(b)) + var b0 = _subspan(b, 0, n) + var a0 = _subspan(a, 0, n) + var a2a1 = _subspan(a, n, len(a)) # (q, c) = divmod(a2a1, b1) — 2n-by-n division via recursion - var result = _bz_two_by_one_slices( - a, b, a2a1_start, a2a1_end, b1_start, b1_end, n, cutoff - ) + var result = _bz_two_by_one_slices(a2a1, b1, n, cutoff) var q = result[0].copy() var c = result[1].copy() # d = q * b0 (multiply materialized q by slice of b — no b copy) - var d = _multiply_magnitudes_slices(q, 0, len(q), b, b0_start, b0_end) + var d = _multiply_magnitudes_slices(q, b0) # r = c * B^n + a0 (shift c, then add slice of a — no a copy) _shift_left_words_inplace(c, n) - _add_from_slice_inplace(c, a, a0_start, a0_end) + _add_from_slice_inplace(c, a0) # Correction: if r < d, quotient was overestimated (at most by 2). if _compare_word_lists(c, d) < 0: # First correction: q -= 1, r += b_full _decrement_inplace(q) - _add_from_slice_inplace(c, b, b_start, b_end) + _add_from_slice_inplace(c, b) # Second correction if still r < d if _compare_word_lists(c, d) < 0: _decrement_inplace(q) - _add_from_slice_inplace(c, b, b_start, b_end) + _add_from_slice_inplace(c, b) # r -= d (now guaranteed r >= d) _subtract_magnitudes_inplace(c, d) diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 53cb71ce..66f243be 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -27,6 +27,7 @@ for the Decimo library. It uses base-2^32 representation with UInt32 words in little-endian order, and a separate sign bit. """ +from std.bit import bit_width, pop_count from std.memory import Pointer, unsafe_memcpy from std.sys import size_of @@ -185,15 +186,6 @@ struct BigInt( self.words = raw_words^ self.sign = sign - @implicit - def __init__(out self, value: Int): - """Initializes a BigInt from an Int. - - Args: - value: The integer value. - """ - self = Self.from_int(value) - def __init__(out self, value: String) raises: """Initializes a BigInt from a decimal string representation. @@ -222,46 +214,6 @@ struct BigInt( # Constructing methods that are not dunders # ===------------------------------------------------------------------=== # - # IMPORTANT: - # This function will be removed in the future when `Int` type is - # a comptime alias of `SIMD[DType.int, 1]`. - @staticmethod - def from_int(value: Int) -> Self: - """Creates a BigInt from a Mojo Int. - - Args: - value: The integer value. - - Returns: - The BigInt representation. - """ - if value == 0: - return Self() - - var sign: Bool - var magnitude: UInt - - if value < 0: - sign = True - magnitude = UInt(0) - UInt(value) - else: - sign = False - magnitude = UInt(value) - - comptime if size_of[Int]() == 4: - # 32-bit platform: magnitude fits in 1 word - return Self(raw_words=[UInt32(magnitude)], sign=sign) - elif size_of[Int]() == 8: - # 64-bit platform: at most 2 words - var words = List[UInt32](capacity=2) - words.append(UInt32(magnitude & 0xFFFF_FFFF)) - var hi = UInt32(magnitude >> 32) - if hi != 0: - words.append(hi) - return Self(raw_words=words^, sign=sign) - else: - comptime assert False, "unsupported platform Int size" - @staticmethod def from_integral_scalar[ dtype: DType, // @@ -1269,7 +1221,7 @@ struct BigInt( return bigint_comparison.greater(self, other) @always_inline - def __gt__(self, other: Int) -> Bool: + def __gt__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Returns True if self > other. Args: @@ -1278,7 +1230,7 @@ struct BigInt( Returns: `True` if self is greater than other, `False` otherwise. """ - return bigint_comparison.greater(self, Self.from_int(other)) + return bigint_comparison.greater(self, Self.from_integral_scalar(other)) @always_inline def __ge__(self, other: Self) -> Bool: @@ -1293,7 +1245,7 @@ struct BigInt( return bigint_comparison.greater_equal(self, other) @always_inline - def __ge__(self, other: Int) -> Bool: + def __ge__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Returns True if self >= other. Args: @@ -1302,7 +1254,9 @@ struct BigInt( Returns: `True` if self is greater than or equal to other, `False` otherwise. """ - return bigint_comparison.greater_equal(self, Self.from_int(other)) + return bigint_comparison.greater_equal( + self, Self.from_integral_scalar(other) + ) @always_inline def __lt__(self, other: Self) -> Bool: @@ -1317,7 +1271,7 @@ struct BigInt( return bigint_comparison.less(self, other) @always_inline - def __lt__(self, other: Int) -> Bool: + def __lt__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Returns True if self < other. Args: @@ -1326,7 +1280,7 @@ struct BigInt( Returns: `True` if self is less than other, `False` otherwise. """ - return bigint_comparison.less(self, Self.from_int(other)) + return bigint_comparison.less(self, Self.from_integral_scalar(other)) @always_inline def __le__(self, other: Self) -> Bool: @@ -1341,7 +1295,7 @@ struct BigInt( return bigint_comparison.less_equal(self, other) @always_inline - def __le__(self, other: Int) -> Bool: + def __le__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Returns True if self <= other. Args: @@ -1350,7 +1304,9 @@ struct BigInt( Returns: `True` if self is less than or equal to other, `False` otherwise. """ - return bigint_comparison.less_equal(self, Self.from_int(other)) + return bigint_comparison.less_equal( + self, Self.from_integral_scalar(other) + ) @always_inline def __eq__(self, other: Self) -> Bool: @@ -1365,7 +1321,7 @@ struct BigInt( return bigint_comparison.equal(self, other) @always_inline - def __eq__(self, other: Int) -> Bool: + def __eq__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Returns True if self == other. Args: @@ -1374,7 +1330,7 @@ struct BigInt( Returns: `True` if the two values are equal, `False` otherwise. """ - return bigint_comparison.equal(self, Self.from_int(other)) + return bigint_comparison.equal(self, Self.from_integral_scalar(other)) @always_inline def __ne__(self, other: Self) -> Bool: @@ -1389,7 +1345,7 @@ struct BigInt( return bigint_comparison.not_equal(self, other) @always_inline - def __ne__(self, other: Int) -> Bool: + def __ne__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Returns True if self != other. Args: @@ -1398,7 +1354,9 @@ struct BigInt( Returns: `True` if the two values are not equal, `False` otherwise. """ - return bigint_comparison.not_equal(self, Self.from_int(other)) + return bigint_comparison.not_equal( + self, Self.from_integral_scalar(other) + ) # ===------------------------------------------------------------------=== # # Mathematical methods that do not implement a trait (not a dunder) @@ -1592,8 +1550,8 @@ struct BigInt( return bigint_bitwise.bitwise_and(self, other) @always_inline - def __and__(self, other: Int) -> Self: - """Returns self & other where other is an Int. + def __and__(self, other: Scalar) -> Self where other.dtype.is_integral(): + """Returns self & other where other is an integral scalar. Args: other: The right-hand side operand. @@ -1616,8 +1574,8 @@ struct BigInt( return bigint_bitwise.bitwise_or(self, other) @always_inline - def __or__(self, other: Int) -> Self: - """Returns self | other where other is an Int. + def __or__(self, other: Scalar) -> Self where other.dtype.is_integral(): + """Returns self | other where other is an integral scalar. Args: other: The right-hand side operand. @@ -1640,8 +1598,8 @@ struct BigInt( return bigint_bitwise.bitwise_xor(self, other) @always_inline - def __xor__(self, other: Int) -> Self: - """Returns self ^ other where other is an Int. + def __xor__(self, other: Scalar) -> Self where other.dtype.is_integral(): + """Returns self ^ other where other is an integral scalar. Args: other: The right-hand side operand. @@ -1771,7 +1729,7 @@ struct BigInt( ValueError: If the exponent is negative or the modulus is not positive. """ return bigint_number_theory.mod_pow( - self, Self.from_int(exponent), modulus + self, Self.from_integral_scalar(exponent), modulus ) @always_inline @@ -1855,14 +1813,9 @@ struct BigInt( var n_words = len(self.words) var msw = self.words[n_words - 1] - # Count bits in the most significant word - var bits_in_msw = 32 - var probe: UInt32 = 1 << 31 - while probe != 0 and (msw & probe) == 0: - bits_in_msw -= 1 - probe >>= 1 - - return (n_words - 1) * 32 + bits_in_msw + # `std.bit.bit_width` lowers to a hardware `clz`, replacing the + # bit-at-a-time probe loop. + return (n_words - 1) * 32 + Int(bit_width(msw)) def bit_count(self) -> Int: """Returns the number of ones in the binary representation of the @@ -1881,13 +1834,11 @@ struct BigInt( BigInt(0).bit_count() # 0 ``` """ + # `std.bit.pop_count` lowers to a single `cnt` instruction, making + # this O(words) instead of O(set bits). var count = 0 for i in range(len(self.words)): - var w = self.words[i] - # Kernighan's bit-counting trick - while w != 0: - w &= w - 1 - count += 1 + count += Int(pop_count(self.words[i])) return count def number_of_words(self) -> Int: diff --git a/src/decimo/bigint/exponential.mojo b/src/decimo/bigint/exponential.mojo index cf3463a8..84e8049e 100644 --- a/src/decimo/bigint/exponential.mojo +++ b/src/decimo/bigint/exponential.mojo @@ -300,7 +300,7 @@ def sqrt(x: BigInt) raises -> BigInt: guess -= 1 while (guess + 1) * (guess + 1) <= val: guess += 1 - return BigInt.from_int(Int(guess)) + return BigInt.from_integral_scalar(Int(guess)) # Special case: two words — compute via UInt64 sqrt if len(x.words) == 2: diff --git a/src/decimo/bigint/number_theory.mojo b/src/decimo/bigint/number_theory.mojo index abf6d973..36162fab 100644 --- a/src/decimo/bigint/number_theory.mojo +++ b/src/decimo/bigint/number_theory.mojo @@ -20,6 +20,8 @@ Provides greatest common divisor (GCD), extended GCD, least common multiple (LCM), modular exponentiation, and modular multiplicative inverse. """ +from std.bit import count_trailing_zeros + from decimo.bigint.bigint import BigInt from decimo.bigint.comparison import compare_magnitudes from decimo.bigint.arithmetics import ( @@ -61,14 +63,9 @@ def _count_trailing_zeros(words: List[UInt32]) -> Int: if i == n: return 0 # Value is zero - # Count trailing zeros in the first non-zero word - var word = words[i] - var bits = 0 - while (word & 1) == 0: - word >>= 1 - bits += 1 - - return i * 32 + bits + # `std.bit.count_trailing_zeros` lowers to `rbit`+`clz` on arm64, + # replacing the bit-at-a-time shift loop. + return i * 32 + Int(count_trailing_zeros(words[i])) # ===----------------------------------------------------------------------=== # diff --git a/src/decimo/bigint10/bigint10.mojo b/src/decimo/bigint10/bigint10.mojo index 1774ff7c..0388b604 100644 --- a/src/decimo/bigint10/bigint10.mojo +++ b/src/decimo/bigint10/bigint10.mojo @@ -170,18 +170,6 @@ struct BigInt10( previous_error=e^, ) - # TODO: If Mojo makes Int type an alias of SIMD[DType.index, 1], - # we can remove this method. - @implicit - def __init__(out self, value: Int): - """Initializes a BigInt10 from an `Int` object. - See `from_int()` for more information. - - Args: - value: The integer value to convert. - """ - self = Self.from_int(value) - @implicit def __init__(out self, value: Scalar): """Constructs a BigInt10 from an integral scalar. @@ -210,7 +198,7 @@ struct BigInt10( # Constructing methods that are not dunders # # from_words(*words: UInt32, sign: Bool) -> Self - # from_int(value: Int) -> Self + # from_integral_scalar[dtype: DType](value: Scalar[dtype]) -> Self # from_string(value: String) -> Self # ===------------------------------------------------------------------=== # @@ -279,47 +267,6 @@ struct BigInt10( return Self(BigUInt(raw_words=list_of_words^), sign) - @staticmethod - def from_int(value: Int) -> Self: - """Creates a BigInt10 from an integer. - - Args: - value: The integer value to convert. - - Returns: - A new `BigInt10` from the given integer. - """ - if value == 0: - return Self() - - var words = List[UInt32](capacity=2) - var sign: Bool - var remainder: Int - var quotient: Int - var is_min: Bool = False - if value < 0: - sign = True - # Handle the case of Int.MIN due to asymmetry of Int.MIN and Int.MAX - if value == Int.MIN: - is_min = True - remainder = Int.MAX - else: - remainder = -value - else: - sign = False - remainder = value - - while remainder != 0: - quotient = remainder // BigUInt.BASE - remainder = remainder % BigUInt.BASE - words.append(UInt32(remainder)) - remainder = quotient - - if is_min: - words[0] += 1 - - return Self(BigUInt(raw_words=words^), sign) - @staticmethod def from_integral_scalar[dtype: DType, //](value: SIMD[dtype, 1]) -> Self: """Initializes a BigInt10 from an integral scalar. @@ -876,7 +823,7 @@ struct BigInt10( return bigint10_comparison.greater(self, other) @always_inline - def __gt__(self, other: Int) -> Bool: + def __gt__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Checks if this value is greater than `other`. Args: @@ -885,7 +832,9 @@ struct BigInt10( Returns: `True` if `self > other`, `False` otherwise. """ - return bigint10_comparison.greater(self, Self.from_int(other)) + return bigint10_comparison.greater( + self, Self.from_integral_scalar(other) + ) @always_inline def __ge__(self, other: Self) -> Bool: @@ -900,7 +849,7 @@ struct BigInt10( return bigint10_comparison.greater_equal(self, other) @always_inline - def __ge__(self, other: Int) -> Bool: + def __ge__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Checks if this value is greater than or equal to `other`. Args: @@ -909,7 +858,9 @@ struct BigInt10( Returns: `True` if `self >= other`, `False` otherwise. """ - return bigint10_comparison.greater_equal(self, Self.from_int(other)) + return bigint10_comparison.greater_equal( + self, Self.from_integral_scalar(other) + ) @always_inline def __lt__(self, other: Self) -> Bool: @@ -924,7 +875,7 @@ struct BigInt10( return bigint10_comparison.less(self, other) @always_inline - def __lt__(self, other: Int) -> Bool: + def __lt__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Checks if this value is less than `other`. Args: @@ -933,7 +884,7 @@ struct BigInt10( Returns: `True` if `self < other`, `False` otherwise. """ - return bigint10_comparison.less(self, Self.from_int(other)) + return bigint10_comparison.less(self, Self.from_integral_scalar(other)) @always_inline def __le__(self, other: Self) -> Bool: @@ -948,7 +899,7 @@ struct BigInt10( return bigint10_comparison.less_equal(self, other) @always_inline - def __le__(self, other: Int) -> Bool: + def __le__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Checks if this value is less than or equal to `other`. Args: @@ -957,7 +908,9 @@ struct BigInt10( Returns: `True` if `self <= other`, `False` otherwise. """ - return bigint10_comparison.less_equal(self, Self.from_int(other)) + return bigint10_comparison.less_equal( + self, Self.from_integral_scalar(other) + ) @always_inline def __eq__(self, other: Self) -> Bool: @@ -972,7 +925,7 @@ struct BigInt10( return bigint10_comparison.equal(self, other) @always_inline - def __eq__(self, other: Int) -> Bool: + def __eq__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Checks if this value is equal to `other`. Args: @@ -981,7 +934,7 @@ struct BigInt10( Returns: `True` if `self == other`, `False` otherwise. """ - return bigint10_comparison.equal(self, Self.from_int(other)) + return bigint10_comparison.equal(self, Self.from_integral_scalar(other)) @always_inline def __ne__(self, other: Self) -> Bool: @@ -996,7 +949,7 @@ struct BigInt10( return bigint10_comparison.not_equal(self, other) @always_inline - def __ne__(self, other: Int) -> Bool: + def __ne__(self, other: Scalar) -> Bool where other.dtype.is_integral(): """Checks if this value is not equal to `other`. Args: @@ -1005,7 +958,9 @@ struct BigInt10( Returns: `True` if `self != other`, `False` otherwise. """ - return bigint10_comparison.not_equal(self, Self.from_int(other)) + return bigint10_comparison.not_equal( + self, Self.from_integral_scalar(other) + ) # ===------------------------------------------------------------------=== # # Other dunders diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index aab16fc7..5863c6ec 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -24,6 +24,7 @@ mathematical methods that do not implement a trait. """ from std.memory import Pointer, unsafe_memcpy, memcmp +from std.sys import size_of from decimo.bigint10.bigint10 import BigInt10 import decimo.biguint.arithmetics as biguint_arithmetics @@ -38,6 +39,7 @@ from decimo.errors import ( ) import decimo.str as decimo_str from decimo.rounding_mode import RoundingMode +from decimo.utility import unsigned_counterpart # Type aliases comptime BUInt = BigUInt @@ -240,36 +242,26 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): else: self.words = raw_words^ - # TODO: If Mojo makes Int type an alias of SIMD[DType.index, 1], - # we can remove this method. - def __init__(out self, value: Int) raises: - """Initializes a BigUInt from an `Int`. - See `from_int()` for more information. + @implicit + def __init__( + out self, value: Scalar + ) raises where value.dtype.is_integral(): + """Initializes a BigUInt from any integral scalar. + This includes all SIMD integral types, both unsigned (UInt8, UInt32, + UInt64, ...) and signed (Int8, Int32, Int64, the platform-sized `Int`, + ...). Signed values must be non-negative. + See `from_integral_scalar()` for more information. + + Constraints: + The dtype of the scalar must be integral. Args: - value: The integer to initialize the `BigUInt` from. + value: The integral scalar to initialize the `BigUInt` from. Raises: - ConversionError: If the value is negative. - """ - try: - self = Self.from_int(value) - except e: - raise ConversionError( - message="See the above exception.", - function="BigUInt.__init__(value: Int)", - previous_error=e^, - ) - - @implicit - def __init__(out self, value: Scalar): - """Initializes a BigUInt from an unsigned integral scalar. - See `from_unsigned_integral_scalar()` for more information. - - Args: - value: The unsigned integral scalar to initialize the `BigUInt` from. + OverflowError: If the value is negative. """ - self = Self.from_unsigned_integral_scalar(value) + self = Self.from_integral_scalar(value) def __init__(out self, value: String, *, ignore_sign: Bool = False) raises: """Initializes a BigUInt from a string representation. @@ -300,8 +292,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): # # from_list(var words: List[UInt32]) -> Self # from_words(*words: UInt32) -> Self - # from_int(value: Int) -> Self + # from_integral_scalar[dtype: DType](value: Scalar[dtype]) -> Self # from_unsigned_integral_scalar[dtype: DType](value: Scalar[dtype]) -> Self + # from_absolute_integral_scalar[dtype: DType](value: Scalar[dtype]) -> Self # from_string(value: String) -> Self # ===------------------------------------------------------------------=== # @@ -450,54 +443,70 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): return result^ @staticmethod - def from_int(value: Int) raises -> Self: - """Creates a BigUInt from an integer. + def from_uint32_unsafe(unsafe_value: UInt32) -> Self: + """Creates a BigUInt from a `UInt32` object without checking the value. Args: - value: The integer value to be converted to BigUInt. + unsafe_value: The `UInt32` value to wrap directly as a single word. Returns: - The BigUInt representation of the integer value. - - Raises: - OverflowError: If the value is negative. + A single-word `BigUInt` containing the given value. """ - if value == 0: - return Self() + return Self(raw_words=[unsafe_value]) - if value < 0: - raise OverflowError( - function="BigUInt.from_int(value: Int)", - message=( - "The input value " - + String(value) - + " is negative and is not compatible with BigUInt." - ), - ) + @staticmethod + def from_integral_scalar[ + dtype: DType, // + ](value: SIMD[dtype, 1]) raises -> Self where dtype.is_integral(): + """Initializes a BigUInt from any integral scalar. + This includes all SIMD integral types, both unsigned (UInt8, UInt16, + UInt32, UInt64, UInt128, UInt256 and the platform-sized `UInt`) and + signed (Int8, Int16, Int32, Int64, Int128, Int256 and the + platform-sized `Int`). Signed values must be non-negative. - var list_of_words = List[UInt32]() - var remainder: Int = value - var quotient: Int + Constraints: + The dtype must be integral. - while remainder != 0: - quotient = remainder // 1_000_000_000 - remainder = remainder % 1_000_000_000 - list_of_words.append(UInt32(remainder)) - remainder = quotient + Args: + value: The Scalar value to be converted to BigUInt. - return Self(raw_words=list_of_words^) + Returns: + The BigUInt representation of the Scalar value. - @staticmethod - def from_uint32_unsafe(unsafe_value: UInt32) -> Self: - """Creates a BigUInt from a `UInt32` object without checking the value. + Raises: + OverflowError: If the value is negative. - Args: - unsafe_value: The `UInt32` value to wrap directly as a single word. + Notes: + This is the general entry point and the one backing + `BigUInt(value)`. It has to be able to raise, because a signed + scalar can be negative. Code that already holds an unsigned scalar, + and that cannot or does not want to raise, should call + `from_unsigned_integral_scalar()` directly instead. - Returns: - A single-word `BigUInt` containing the given value. + Parameters: + dtype: The scalar data type, must be integral. """ - return Self(raw_words=[unsafe_value]) + + # Reject negatives. For an unsigned dtype this branch does not exist + # at all, so nothing is added to the unsigned path. + comptime if dtype.is_signed(): + if value < 0: + raise OverflowError( + function="BigUInt.from_integral_scalar()", + message=( + "The input value " + + String(value) + + " is negative and is not compatible with BigUInt." + ), + ) + + # The value is now known to be non-negative, so move it into an + # unsigned word of the same width and hand it to the unsigned path. + # Casting to the unsigned counterpart rather than to a fixed type keeps + # the full range, so `Int.MIN`-style asymmetry never has to be + # special-cased. + comptime unsigned_dtype = unsigned_counterpart[dtype]() + return Self.from_unsigned_integral_scalar(Scalar[unsigned_dtype](value)) @staticmethod def from_unsigned_integral_scalar[ @@ -517,39 +526,41 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): The BigUInt representation of the Scalar value. Notes: - This method can handle generic unsigned integral scalar types. For - scalars whose width is smaller than 32 bits, we can directly convert - them to UInt32 and initialize the BigUInt with one word. For scalars - whose width is larger than and equal to 32 bits, we can repeatedly - divide the value by 1_000_000_000 and take the remainder as the - words of the BigUInt. Because the dtype is unsigned, we don't need - to worry about negative values. - - UInt8, UInt16: directly convert to UInt32. - - UInt32: Check whether one word or two words are needed. - - UInt64, UInt128, etc: repeatedly divide by 1_000_000_000. - - UIndex (UInt): repeatedly divide by 1_000_000_000. + An unsigned scalar can never be out of range for a BigUInt, so this + method cannot fail and is not marked `raises`. That is why it is + kept alongside the general `from_integral_scalar()`: it is the + entry point usable from non-raising code, such as the single-word + fast paths in `decimo.biguint.arithmetics`. + + Scalars narrower than a base-10^9 word always fit in one word and + are converted directly. A 32-bit scalar needs one word or two, + decided by a comparison. Wider scalars are peeled one word at a + time by repeated division by 10^9; the number of words this can + produce is known at compile time from the scalar width, so the word + list is allocated exactly once and never grows. Parameters: dtype: The scalar data type, must be integral and unsigned. """ - # Only allow unsigned integral types comptime assert ( dtype.is_integral() and dtype.is_unsigned() ), "dtype must be unsigned integral." - # Evaluate the conditions at compile time. - # UInt8 and UInt16 can be directly converted to UInt32. - comptime if (dtype == DType.uint8) or (dtype == DType.uint16): + comptime value_bits = size_of[Scalar[dtype]]() * 8 + + # 8- and 16-bit scalars are at most 65_535 < 10^9, so one word always + # suffices and no division is needed. + comptime if value_bits <= 16: return Self(raw_words=[UInt32(value)]) - # UInt32 is special, so we have a separate method for it. - comptime if dtype == DType.uint32: - if value <= 999_999_999: - # One word is enough + # A 32-bit scalar needs one word or two, decided by a comparison that + # is cheaper than the general division loop. This is a hot path: the + # single-word `add` fast paths land here. + elif value_bits == 32: + if value <= Self.BASE_MAX: return Self(raw_words=[UInt32(value)]) else: - # Two words are needed return Self( raw_words=[ UInt32(value) % UInt32(Self.BASE), @@ -557,20 +568,30 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): ] ) - if value == 0: - return Self() - - var list_of_words = List[UInt32]() - var remainder: Scalar[dtype] = value - var quotient: Scalar[dtype] + else: + if value == 0: + return Self() + + # Upper bound on the number of base-10^9 words, evaluated at + # compile time so that the list is allocated once and never grows. + # A `w`-bit unsigned value has at most `floor(w * log10(2)) + 1` + # decimal digits; 30103/100000 is log10(2) rounded up, which is + # exact for every width in use (up to 256 bits). + comptime decimal_digits = value_bits * 30103 // 100000 + 1 + comptime number_of_words = ( + decimal_digits + 8 + ) // 9 # Trick to round up division by the 9 digits per word + + var words = List[UInt32](capacity=number_of_words) + var remainder: Scalar[dtype] = value + var quotient: Scalar[dtype] - while remainder != 0: - quotient = remainder // Self.BASE - remainder = remainder % Self.BASE - list_of_words.append(UInt32(remainder)) - remainder = quotient + while remainder != 0: + quotient = remainder // Self.BASE + words.append(UInt32(remainder % Self.BASE)) + remainder = quotient - return Self(raw_words=list_of_words^) + return Self(raw_words=words^) @staticmethod def from_absolute_integral_scalar[ diff --git a/tests/bigint/test_bigint_large_algorithms.mojo b/tests/bigint/test_bigint_large_algorithms.mojo new file mode 100644 index 00000000..861248c4 --- /dev/null +++ b/tests/bigint/test_bigint_large_algorithms.mojo @@ -0,0 +1,470 @@ +""" +Characterization tests for the large-operand code paths of BigInt. + +These exercise the algorithms that only engage above the size cutoffs in +`bigint/arithmetics.mojo`, and which no other test in the suite reaches: + - Karatsuba multiplication (len_max > CUTOFF_KARATSUBA = 48 words) + - Burnikel-Ziegler division (len_b > CUTOFF_BURNIKEL_ZIEGLER = 64 words) + +Expected values were computed with Python's arbitrary-precision integers. +Operand bit widths are chosen to straddle each cutoff, including cases just +below and just above the boundary. Generated with seed 20260812. +""" + +from std import testing +from decimo.bigint.bigint import BigInt + + +# ===----------------------------------------------------------------=== # +# Karatsuba multiplication (> 48 words = > 1536 bits) +# ===----------------------------------------------------------------=== # + + +def test_multiply_at_karatsuba_boundary() raises: + """Products straddling the Karatsuba cutoff (1536 bits = 48 words).""" + testing.assert_equal( + String( + BigInt( + "346611373155408952734750390476041745282292187571066432675324746607720662422817136876596988044410462739919917335260074531648593168297274896268743768189605933971328306508397042997649653859338767744004345245108694245533413720865920792857250027500354953110302155788652650328021079205031735864775348850914137905446949228241514261942507894892499733768402731452860788401841117103006266034593799033276094132834164035127973283912167806606840398782877417506134806" + ) + * BigInt( + "466969511505687435140325005846743584428838912640118612495552031516490370105857673769102725808880192931522220410934363689526707256752198969302768420784554522787492893006002871343670056658512696949627974537171133980113421620141182258674919689870417638874243347126510068417859768042889239932797941164521490649668642828499661546485505213385571882368090050973797627355853030385603453695475792338415115381948117930134595827811161224824714306231893353534934931" + ) + ), + "161856943604696861944993355196709014914097941128182487797539905684251548918530808246840936266673464966849801013515851938488018833944257699008940519729429565705186891634233994920806997583635175781466322442441700023375136832901685934131260959455228497380164893775171317012840759855246978243300836024291914067531212257003058335095552469898302879624438529167358375033034854478093346084970531390007147374816022077589750825443745119455340822407955990849936069321934508762560132281023974631739741119199711657452878659020042554243289425900065807312176447866930660113529768139866905832032889216078566533534543246136724021433380597138035572054334442628821401277380236271304796575805348913868058933517850948174996475734071299337776373454092889300151220251240958376756325988198872969038170997594353419236250615639932301274445420247609803152996891199867116174652823719881137320388561302876837457144149548446932524308386", + ) + testing.assert_equal( + String( + BigInt( + "1331644158960604479416981566735008658214896201516174602265645796295431139613039639261450675770175685837112301389556340715639326824369383137975290751610789093182455238810123891527907460235004751688507572661974217581328700452829702194016417378946571594445766689312291512199109603920911031108092609567398596343370488882846406256282991915995940412834950416567329153994490994771298291568617816932228086168739340259141949901326816220668425931740171458014698901638819177" + ) + * BigInt( + "2145492159015237116845150373165257322672275905098886800455241715625930709642765013060945102373803304808683911994217262882690220220877755764740891281100122809414328505660214225914451185394907654880182855390567594636553230478676768913788009336842926326533105689650892035679645677095642711600820046442794912960375509625912467677054587954435428454267992687309760915018605510422658103011617156055773875527775838145595851875667365036327578529050935351171178407743560148" + ) + ), + "2857032101648416918135655570629382584046110681202818967848519502394001630519738750214965574344164429292063957705777008317330651032399100333086330439353256459869161168296857269623173012103819890148251549639480853661218535487471146215901395875099485966488556083490920680985365115043682007789471852352708802634469158865899137487863572862664949323288965099869215999821957322751879207290580275096776117176638634216731292410524126419150788405922176663473029180901089725495159544014990414037544652656745154097478574917270967952200217936723939271172486657408093920172025409792934317899965826871484897509684310143787385619500568296494978954577643627582459173280398749786131046136587821109869174909876631000148228320525575812571029444240082250677466922855193840846863975339215519786827157739596899899849017696142616852991914529236104560320143314752254996017684627962097495970207379972620386248804631834521690439994184557908868795358196", + ) + testing.assert_equal( + String( + BigInt( + "8945028404140149586161912014903757884647223069478264962978987583084069072427777072416341943429509427421769236510298313750268376218226118175685337804452508765341072163685322880335963613862900805431614549519494141572931099906196496521006478703463798788351138265561861239120746662199297350373395072895381190446543252339930977242100997345796181095000187798626711449082816953587000351217219443693898811674346785647136759722321597415840953287415609058261506786460109743716242505" + ) + * BigInt( + "6406543526428048843494188668501501542210057259712021301026397659254667011122561001025084798385795089085449302688332684863490746803290549230697136161354470154866881870794963940076101957282898868574120376180376834408709485528403461241033956444569277274098194794747849988660458243809415868426823205815195122354725916305835058971609828001585731642222281411404753776282659269511100513748247010036663212969356234760963008827090094358591277141240146956621703645120592700693772769" + ) + ), + "57306713816259095991312035723816952586700632955688417724642719359401075234937696410655433963775958826080498574370747913394885526376481484745531257353988468718441119234661040085567486485581845549861167843979963333969479801626517807723244086873889919076674507585385079867799720297202404871214163340230395943967541391788893758965312650254704408337739985070171339478728196197528878266244231226547689579117780543110847539002020605994020138567268869100045210593276255137845237573125703007914657404624481858772121691065508255781904127389735535543100669415519790947431400558883147753396072751420493501385074886405973513200058262271029230220274020438891780593954859285613538558197295500185897866540778498738925801599543939849967747271993128020285430815144559636033704668580785497134308745932756549987453278765363239042933734464517897350908544092553581438750465857904071770812422877830747394828035600823549820623153204721084556708202487474611412969346345", + ) + + +def test_multiply_karatsuba_large() raises: + """Products well above the Karatsuba cutoff.""" + testing.assert_equal( + String( + BigInt( + "882276861890750735430650027746457859889638000942345281317103541355716926775525560331506688686242374087990729407697022054416072517629060044534233709142190615332642757104069970592275616297484377947757351058386562629960561944439387245379922443091300109108463543559060176806630641069260759595619179677901096209884271374365310054445693862777936953018009603069515429051247136790908242335356445023806100252262578651642816587172684899899445137199056721309694391012179616826071037611914687213943523148881552177183721855953959008926724482499314556840280324785690453323490592151323821482386795402062778543920028491297894678061872640713521374855310045049881751746341698787667522483564104690845069696292084284856097528647226259936391186052751533548737961876876085727822727234793597041343999255166535310402848512705090231146150555290342284719527441734756666056565713401282783643336610222195353677140072190674867995188843947143638323414859797897801669599999297543900820800837041886151015859933501626318042539950606743051704944014042970841838750580140752644238816903072492985336731415244158059818690486035784744386916168507022877378238048888365461050145256138938315848911585781245883254560644989572314418698404713297930860383578586312788761741977934" + ) + * BigInt( + "876087976472020329401206916654782735909063480821318423444935410412116470457498822548737934298445496186389205147998577983468421939385434657615068511653781591820272415564021238383483136206143648188541531743414426049567341028290717572390641677862074514398366780885252979244212243867636429967633385262205599324888092374547706653674769290078263270040051998819233767553891882229547716250566581449869667639648342247976382736020981437609778490641049723775344802172566660164855091623683457152870374470145804416018105443616132956436315735303088735076910816379176556902781222307997164686757030739265148978589580320008086314956535671987238244222800332947077016686541820246520864983934618803483784164737564483810850540998606790091382995674771299303254947427876552069578556831031451105249958180162184464247949823428425516250337452722398616410417860574690064798387672485137297166077513152864053758604166835919952687521895597741121302236704985988467440070506633886813593539962618739689110825205318661881386125255942341625747766091539593957016457489120886517585299689771660080751210494180043367271248651154426078812733205900041668120840888052141845456770400188168071383159495927107814780697508475602016096860472457195132479771075645800509716680081278" + ) + ), + "772952150621951959896684974762751179365698449602536903597095735060685144270475846061594252081804762957776984506859306624991276781994238029133194359362080622493864467470576048713308046482945240835777803363913805364505868349010878849830176203745048718633446908850397401150784175040465841059178169936462097431691419008866486580584451469400760906552809767249212553527835959892744678513232705931490443724868944281168630384227266087119752331572399627476698122901841110536408603323672417829251907352057539260056240287243570691172158660409449002998664408639025452745801053679491047279822927475419524627214559570820129675656992579534922492378292812912392399610573717098496974298371538376520587648825638948838112145632570877065037984928529177777055821586950590731507596615037527113619077206927045701765530250593658064583848774337558377794524141089563576742441145453439581440524380389863562701219491922056965866249792053239526279147561516943982211918422687140329746862691211790173716267956087202278540274451178244620150461494611453555139910560248088936090807372037030548498758184238538184599727491382706499684448645841596960410206388469574061826906080537977206167729768385407963718018336285605172848256377502035446722370719448084374908027310073263839289319379189293752083049726707933782299378256007237339602117398509145911027982950305601229579208364274755745010436138973857497429956935018500157904733892350639834727528009767230727232805962351086076359348122446121878464508404238992426693237915444813726023245738377419175070157585927371697679999117610568060185246906089375732353696351384025595359987551752976364123859841086217648454602408601491102971685281085140034409830911453426107996713689068363589998717865304248686061236066097663643418000519469882969515956419925352579635642857293710920219448544719175023120007253816800396823251997190139388091622667053051555701971760148933476798717122551014475620338129928084458519064122591309290315475645353716433866358539064655416699625165028245214282290935938668837273876510172392787618898192742183479466559530695661630308469193763520356988504549037591243295210051043613417248766257943696598062183958745142678270683559093106965358220066616098788879811169316902902604304438821494331496308722307316851473648254565814568753689739944016944127236006739592931154641186669532910990503237364041571005326244404688876016649650158174165370762952068794693953280706127422522552381996984983816287238561993654312676311901059057914540054128603602519652", + ) + testing.assert_equal( + String( + BigInt( + "716038994156289336717943127692300080791995969991827912737144956325298118943387132901797440890485658582079523882000548217381486979019688364042609105884688073214631762278521598009146090356092385153281741935827674524157209347610000208557821407801512379209586743779470538989874424504088736845404494652692005232072160395730275434147406176217765270942911141839560569802891118403333480928677867292235743638785943013122384549093579919134227486233369226924975999819960643774043521808520483111757795033549599696820688748054553105189241780269683644860021982805769696904311258791380629156020981632498751258061349352288601554014716986797351939201649447609452525996677509747452117812804108103999480972812673705926298054217200942470511237734326369592916323642231633995780479052422053957200558055830887935947806384942587125691422624506099794917999584393695404075699389732763273043536763322210857044951063484477631517568201308485322767819146259727542524076876405510240793331184550593943055806437848204836075328474194860279064620074771360687492753960660302323901990628152474867356995439555579773721723976147324786967883171913443835975455283958179882464805073394833651590961605092182121797848064441339516379466515590821798149518048484641176616120632682219182584138464735473211115103810969296392329620045325685477187272588809592884979461687301964851347537323812417103870537535436451141592833193869313377983151819042425519198254619079657925175167766845457755967267653193284367615878449112417775770542985923529341921742459266492213972179031446846787928198987623933833302247604520592302941528801276468451107267580546975777907501245399095606807986851109821144477119115715632391566627020403713508820195910164376006770666211014535018311233121499368048650070335664027047372463306755897695716251829518273002706127537918217603997090602734569701713881851194303923908916229434888552115303281245277541529568917337785463960166019407845481868607564120224294635044821064456015268671276749698588001246208569103903569489315763840617846619501274489392887517048442704382845444407014980463526098629244595416929921116909589749220843107965558767880117240057457096259036740076233904876323238731830527894575800517395756718762140195907477528036654590792864006849861309056916546508681077096006618829005075502660168732562660290372769508654349887098722839166308892502302057189924133041086421438471707872362007827542786315766405849202806403494261894013788637215223734642301655507124803226243991327703536117638906485" + ) + * BigInt( + "947198801122019999213496316275433150984982154548307087672728032181293346175154151770491590564784216762749373108120968583149510355677724528717588285355498646764908457385972009282608758316161828317056794481426581811783154360068271589097749908496728610873506060320234395260680089674019131829948719592355969290314378049745445442232778047705477594585819472556777114680739050859618832157377300288796361593416199132253586234682814197898403548637031065920573585986148130357508062936501843300683384803050231269009190249295349542866604397863560593916874112535190423602628579888474585154151658408720557341968803934412225259517535307868534917411506852389337610414059267825796365252409789339744885385531995002548125000845453304958513497139985548284928883591396546276749351233778114045358703341496978838704870598841229420946422266030501457853235167931619513979812756757138005674150638498302506110135812171050053807204359161000061944769527313429894458806772465585243876358879428256890116953522612049078144011118586216405460759675561494655072078660881114497199733985543342630150606592957943292134987578291650067925793112935964947919335827224523149486460260171615275536787661386986218171431641021460472689530653024536081161947828092378091500025931073556499710881856858770983907103698752000275858682651576969350074993178412950443746516990926471581065126220498524725574906335881774958183080365822353409937607038461906332162824685305862362538709675693051136962765338445432655034309891458119829169886407402313275512911887519008431252244747426847770446764600792164973902965626800129628236517012159889655159153097090645954843501213993846525595193149958061141371864513883757766506347611718394022695935688336017209500476650948397135300409173395729231481872089460283932834867317509597017687069893963670704273641621047064713045853651782460656263145228079249642570396587286833114211131396005713455178074636927172892262143459019719222561242086660575092012967186349025191145432089139721303051381384843025952551861073445005668060749694206933256846978256359272547144435119226615689309844322461006627190439528288846580629190251223510676616202123490309552064409428178001058370120737300080078832307252718007711947418541149206774788156216608515206296104315202494461878055288678320713139236434757502101920564706914932343226762651889447549760031031144354295364292435660696353767854372728739901464350022464107356372676010641664809736894990905376749128992814996133702679445251496112196570735370002508674336" + ) + ), + "678231276821454343852104124008304795189401425727152571279714591405443464266745029053050298558929328866625118490121549400899513584336771297153093080217209721840748511566613382321758096892377769838438570332835346493629064396563038095430776302991651620580319595306539961224911291123590874566621791164202630834169594311768352941810836335271341243862924896007532178987795551202792531733325072425855773023587218381875730589573774051901346818492216598569115153610319909144297006683531437533779541710371834681300104873492056002724585334997203238466212753685771408681544029811841474999066655377036982773967507754335663433573633065683466495306419794847333743487008026037900275665542772550080575129926305109050722659100131022982227556682933067804170527298937704035355099392992502228835291089190682549373329223525316134397438230881639638205987556551549669895012065052224676333553788044582203895318863209547493737070963993765571206022073175542873143250857060561937210149524809306925971179748575789497995784437825496784635294345267021650978202279146504841387872438760582642193127847003345762935311914203820984510590197908285080101124384821832610315625301812490658572436974988548082969258449806267460899512951798992625950625225277763839577987581783134989996166786584801668129876751741830817481385528561626533617485275832946278649841633043928676006926184078972591766034004272795027446882381155920059391808281421587089050790850857593253023808689736543829460756756435316423265722871480935482515169118392713931154906403870091011457359067665413796450559596914808648551870296768079768400297883948859026127025910566255303863913084764329492902882194160498252502545567581474959854824130630719948766994279843639714649581638661554025237925144832300271788815156605414994790735457984144688265248928554260594328246978437420019836648146672642611499399439730829951170762761273102184372086082901996495512870617254658064943526650439629993110205409805976557046296363933147137755618153789305658908888377919003982843521137107917984883037969036863249501854777980578730178590600168607087637961031779858338953573999531288639133799604096694536810276302782357399115721396483939616240713242918900926656691547678900610510311421442995523463846437329354395705050552843893011516886721639485215060822031481915312073261039101912620218087991644331408433216591699207609822309763780801535264532801774399046785952744041616434738593705784518806484464155438345554116372428758192946305713608540290449335370328959251847992759761873841703652255840884039714469541795144135434885969316564363890754512380168071520953573007488729904306844599812744484886879437868699527208826527095217380636255281451668516174259655970183370210575543179898892742934512531930381417216095682479466905809838430410165569450240452406472461620185347830872878952147640531875930358169346652694369261358322629155311721737056357202340104483314040239392080078326244829798094842097174850013694736354606212053920053318625229303260565699909735950763826113943473003186717165166025815651621818079031967183188318659900941081676266235605944811917345650554085726577363983582535203696482237827376477905795925818535501139755852609798307885612910467021003146847239977048560506873367287037783609164041608891991661322253693040680556167471590800508479454627843461391901971328587388994586681037861597560248056030335853392866628448662077485052486658850728347185122680988029592001941969391701654125335644742063952400830816886867948843224803923030705592840491395223378581126209752239235265331945846574244073873994728249552456936318415795022247675215590573754975287685493484450303230307560070642188635551372752551661471446765460247990130600131877033885610200407666381448460635174242351059172811428092259601029291143471187427595210774816296424499280355562252992227704962578169348998708882605813902164233546511885578675194640093583823654596373460834693455774643936842007583403822495566421008547396613939749306308348185027861292593086044034325674526034969064661675037520023757008898467722413411239462018765201010535723202739997508510193157585263994316526762307079204492164081664705862481742652422831855553497065332953422560937122627078442087151319096915832535534934513361825337146417315540431911372267235195672812276561990926218819270317026616443979553625109685709424638550253391767419250871856908848068231100700015806202100305851840113351744328140888214464709102030873132459819766516923967413975244662990434681732993669800269418631302765802142968700908652812112486804000874471929351533754681252532566784297895009543410201373955113525693806123582462417130180982680683104856912038941335111064869098794029055307335555276263543454070511284046896618955312995486751505536300096325548717757522040162332990260193053477958184787884455132038105023779582481226088199784442255552879788899857926477245556989941072469484718740900904167693089214121762217981292357772063982882860350722668175210012650988337122435212141914049902205439012305986644251614023468960", + ) + + +def test_multiply_karatsuba_unbalanced() raises: + """Karatsuba with strongly unbalanced operand sizes.""" + testing.assert_equal( + String( + BigInt( + "793836445257780996457965544148056328941793337192914285259553456494724028973608828239542648172840002188603739794787423943491286784226652470084614840431895680967234362890820472977100392209993148950058914710993011150569540090892569444954023193878656733368994813849886105374801166526276069925457493493710790871687483499337979695451274431624929557612771758807542160983168411051301764401543920818753232471847661571076221977417352724667691832634424253373459787062533604617508431528736555360445861453260529761880294431066673170073401269996760749344434703837148789956438350337074908984458113829139162102768373634896185944822852968365524129793541642038990233254012272974497143939965690647297649391012189021005076226461968566360306741046945996267987295675488190437175620691609716816196051374448606050298577276288244364983745010254832863043116857003957135671127921568568621589912492134839214526660195510680038245950853164405203148685561442707644718492940817015068537518265114644903002930461041910831978020155025554954899904440252753347717133488356491600043151001703440490647792869452930216050824433417225308198581291084131286944527634150283603517568780474636235958049014071279317495849064304105060552497691682958354716583553274460773181451464052765127748212745031929308222656550135314503800257873403949911693312360344062904643155369514159176997260629412527846299470171802628043658469652510811542339947755914954101652673403422470549380138495778041830523799186268004591660635412986047755023070651283597304125010761930393188412726035283772831674921313575555531406195456903176646865643165675578345603647912434482790846213183879650140863692089413383265324168897582770996647368553428722193385239689721257237689699084783566843291967164764364077215518792648563398536643584169286704096268392692167846164674869296852880121828635943034581366314624663339188918094769436085028617172134234592974750991319577870338767388232374201057979378611894030013910633772275879563654662308107249278928716083599877507319733880711290672346316781562612356288249295763383187141323320123930158641523763542210363588534561629408598640709892974448812329404175135526190697768710185680666684559270660992832031687337944396563747673111721596900261318416548519865939823975806984446377118963208161303598624300649300070860547559857295963355617089657831891673432106316906269705165824811652756113504699995818632551499296598073507038736254040246551578939940666393952938487494825538959044818149349334940484770421292382432915" + ) + * BigInt( + "43938200160409571974805253341110121092638074653180661446707089298916162959892123426132248142548378439180517773108956773405805836359258112105161088069935045667136971054470350285075166472870637286536857504410053689844760183369148246359827902490287784105693000447223405642723474325262867066571458941055809942666913989032285243438064602789235063397982128871918731840860389058615912869635958321670641248578193067543059009804445297638705240467641833254060032128838267013679062297821728104" + ) + ), + "34879744626364397380370952856578401502311818117649456428542273505009373554319788625873604298815282872533787161482734200834347808271061470662378228750121785569190215895174951341819126232787689902642094717251994323754109742937762687058100519370139148167333877776862698932207618491477178854109542464756584011038309301550107994698153678841024452968160764965906467120128343729137078888234180678310744352266639870214841462857541110837399243212438637285617998126231192636830512107697940633115824779143164588724283014053070389139719996644924585557606389136995865239779656515110245416718081213905826185877690985005497915884528900755511945334692064466294847329352234860905948137480004933303258019519301498516016516825517667675891139335243413675113843950771869632190536034673549473621262848147668076030067336493282110700945812083011517332723335987842313455528582370720613005103336983593111932575003167329251719916527199032383515303792160362486545251421246600846644443748767921202083110055616971084257818810090736772008098310699247380284729265129141420073053678947617724921854526629617528903138150565487428198732108590028517048909066782474217074698774009096050004006283646036125681470798061773588405167371468676244561907837063766601635891556841436333889296567443616823419823803111341812303751636974046676850693114897175963305755448348106613947295979854710313336308910530397060096716714040144165674813776169581549578710429372454438850362770208663740651771547879408389576220791998596311839407357290232029672874132575583386174248644067895115604298625680288002999977458130651258701339399261711930291122452766919508863957165273139850131843749508968419621439712407825867676328482702844624297375726177972319293981997039412894184078991817461409707757758325631239313487302773179302414559578964327314079167009403624387891861236028783554357777513780925096980906706409178863514440451428926614836095804598189553163261222314577440100689987682508181949799390746574009181891920706018012259485795885361274466969199307626826789613281067359309391565901323946692574466968828078305999134403611731424806595581720135086099796800366248794679019834551987049935852928445861224758368885692195602405671923313653840415733859837299712066971319483930001475658648885386800189323676878845194414596616637448088918924313336901655312819367143967779103337647457617754977388716921156017484962840074661523987902220329857129597352943979737371042317928144787888665413857783320873331087227419297480095327655055535711469365126600037712877890644724860837614283599586232049596276745625397529075496873341025260013778497809073741791134762964263799526236995344832594022880951987958291309626078655477543782510766552986434748771850351414215891440185958237313341391076006400352179613584801358111588066926108551756445371191345318010994730446229737217925682761761734416280898274136581280195213097919140439556990336994024805835234470410509326768826916312114830583565752091165092786044919296095556578951997150143160", + ) + testing.assert_equal( + String( + BigInt( + "891564367195680663955965311386054885272718286133096176348737698674080629028920777302177010053486350781398284712181478234456771890330979002660025342332305640995420847604749607383356860664999638124719249388949136703335282114673064643192747709564123897191634293071952343267244985991920245919772196093544311787110865006006401300748648055851985888001694232657751389895654760878258490342225289883511741987809917901206668845197158248527790815934801000848650066602267840831253023120902875434036580979917435481494800963970205247746433272194036679406366936694758277294413023834783916897385158567931295208601318908135335228887137069914784401092290552084957853999515043923576134733776694373181468299834318992906234453878367808622597085851799051551059080323484945106764078729682203631213381058380737577267367568732812416031478835810904686341646365505957700442398100860162261632224802955533417157219684925376315355359833192843625292271833353243792270938374593486707898431387055738924142733574705689395584931711247813013301890698850548223949561900353759561698254369580647897468797687230954827031799330818404376208198663057526090070685526833673613619330144540670280064459295127215577331258167586514906545346301682086395517976622293560660501741102145664030061677282223845741888605408995079270502960635069845698621077977527152424190177577148227855083350644571525259184358862147598816211216413658560506931304436089124087055714746571592001489483755737210852738948252138249286681177631098226507316795636942058505467529869689182577572285572564807891354930438387967351568995041067751040912289120240029785054353590653326224249578857457939406270205674480512714649473197447736053477753597984487763982322179020863626365085092363747562313137435543425078776046285180506087582954712849671129346640215262690772524239240848653125471874468798782575630680384090507402451202701443165685644541860187871258508956923193328501832901491860353797144064368540808024243306983638453825476155897059541708997279236543201001424499709673455123741217848955622193795287590953243442258680045371685399151647062178157235057657351693423636564210802468541342722126045727464278354184716890980759157288720284162443401961482028531555647959365160772866772983234817874991363172915062703826775385325212988438562171485927878904782318384009156001224690148469385532597830522010767713722169494850036202745252125102908810471066499995536179633629859207966151388437036527541609447034713875202598896215025167253820845112032338854688420561014046904663071192614463574773890615806228613611542701172346777048370956693042713814608756264897975670503955902994529498929418633432183859520456544502673147505908553613631318119501310653036766750963881045066155699928202632021589678629266856445083414530689781866483559209665628061319852817309512687405961112269628341154951260446608113269996501794642014491885239439412697275708031670037895783367756766651423661668537015220841087149410902146417020630888207609419624417844092206949531480825804138952003320093746983990901750027683611057575942696416281878979352922609009411131515785652298806937529782967411266320184157347820449040321980712249711618789930867627976879161154840267886102836116264521056541558837977847798279233063136972902301001777931514487884847406113939279359217358370226683971686852454431325115178955258255806991386039270646496318086604796329845080423338091228345461615524408001270807486647527501560582231398252048749104576320193108962709904981087553667339045523941901893942726737457304296797692633706081398393463548553220827188614396134698349020246400613343226495187881106032561291080667598372548174788678486525672551307463658880313458532104768882683062825681451882214743779229887883939746747005964214007654882375300331049174597086149386333322576663854005957398002873262736299746055073133969264896718813769844828506804451561963586554398334581260175478635073713271486658830215603773878429006956296131537487926752620797155053288070257995117445175873183821545854642579974974667325776295856258182758635996460314907389079627733272393008832578675558671766537210798884390687463538497213327347243121494150111762644448439432235225589275040576487830088896920332418028623495682851427972724790263696317288804110195023242732875424834522050503919139989053723294959068461930093144669597193402612760845899997644889675595968907998656013669425658953379413674896547222129744818372828808711132790056201169083818177380651475343851383660003186813837792687251185940496333487937180822320046054824412971834971671118443633349416157495657580529439241911392916491756374011292195548176090736960722670750805114247191593376571107992677534242646910807842280248479872865288190784202483770773774972831854126076573661330572092624606868730100909693005151599096352478494612584910413116538097955633464965307478464343608229150292956404981322963228726034672752896881188012158289005793655301642400335423582130662218487446207123787014835377199853750850322871878774903129025076227630589061063246" + ) + * BigInt( + "16165256159836764614136431787171231528625725244921750136633942160356442095311190080748180209557125517959901388650296845430576152851972014950909659413182370058132594409444265449576276459613037056118439780678886520739248118547765604568748807470473514850384612692791812467235845873098098664136879797574973505104251867450155829281709321942583206350076272990221927259383841776561459571780206483363208098393574013045565902351546789021549446230197921309359411577239841062122531713407611285552685186699520566428991595972439833943921482409998642680623823457928447704631896433550602432584942220266828169436560429402618357144146" + ) + ), + "14412366378700943924905663267910848408774192334501665496229652135389233840913402430586784019240128936372542472951715949629237184680925612132180887339581167161257148390159219215113342974099586366658593412208875418275598977395767869563077911999095062405880151950821254961594277952643891540171290860900741645019121989710130616822727204533152181664580766045599467599611378593113689518035119428196062472854592792992744136012484191011744682761669676136382182724641225682701693061154396375769659123528753588963453176932734638318532851609319764400084915672332195188706357384633099494294716389066465388434716077940880299998900183162734948407656805315995510464427899333624190574388830700307888015557569200783815646541787550138754590264111147256295489700618358170966968555888266620874761128604958201263675683610113967502111852292316244884803296361605942578456777855767499073445528482869297871312143550111492915150844937846877728764359784813410911826316747328096797541093191077026865800390983209241001929527802679302873813767944112433375533183748136538495911030317018008510668965418084120223199873943089649832663487482974265401080663595026531591910887617260383262685800198522194505624805359173964387775249297289688035798586486045247474364417511385993072712710863265936869045089956095448720386403034896009470115400945393834081520196789007229971345047151265306457928269579204382041442109506578971058392977171762320337369683087276904824581433668666434491703937018485228448392370316948801864799283130592601913269274195630559268169798053706758835421399059023989457680682570038884256515495798648383217283270501071701284551014539950889592760365100964658077632043839757193225242504410830726255154113850537434191410482175243324359196447053632706208656784322047599009068690378386418936524602136652478509981332781259068189507158392168030727412477601464948238394939574093842124602790231481676150804613502833454764515602604346573879540543839690957321107373092640904526678354215111867013861831709644325086696729063525814953317189418201247902662658010226143140424314051579439445368866279280444012925253301181141970633964938424058757023222043255852952734867059336763661476902212343505670128923068946724681355639330209139348009024049841809156085128619544494118325593929927114912261484447042664786688122143715187191750358273512741893332822904196813847448703872185128855359967632862089224147269236718159064282997231702050634510118361711506173105788646865181823165336654376474512590638288894716794956724134648380438658466513404043202441172128165342064720085540907927565298111595865831956990795957000962947907322489002386964499984887877339570418118722019224904094231799676266062458238288245030690398258101610136049418899474922178766436743440697033069264594804241488801448769656658335257318932674578788924763164906874112524776360952554133590614359238533544717605587946638119116798600249492765208687627988438342906975484102412734386607583103814076929917310565575537442976593234635488737684777684426928110020748288360787142214163291681762522853076783895368194104771127628318970493834796600931886313454818788508860178736784055156240601416794001988259682336320343812872682036455163428573858980576916789887812040193095054732300146620776608564654768194127197729203102615079738477434324785308926922602036722006656590266235272494896222716778493710986954938318482537728277858550601349409132763998232310043428104444270961507996495398467963164168591636387210312768163092675304732838497503543963792027898040358112922675035852386869817334046278631138919689253820129485835696406963271234301124573958365838539902508595631496443083669917461632037005995417873537451236374855438465876130876883123906219543274514958848606755121502317645874845620729032598914256375032907505346921180034146349682900825506505535890409321909071710343628479884353742436442468784003648784806345979735621011572683330489663119659956908538995235073420126816324937683047158702025044182122217218873761759801336627434547320774418633046420734503608607162929718777335227968658631945741725017584819069035240521369188037106571029095369819150490416502315171258426167150393016783017326777080545871686266727554081106248057482406542450307037514726882559567702853862630202131493936669955660022485379361926842903327915873024121100836507132125680483178943697980340372717377977358180336087705067694178276846819021695117421206814199139223665762409779951427790052869041409123237338820595953943036450503023063746519491857028212833305186044046901437514143837297189003762199316649351827008384199285713104823640954944883744633015502650376653154556267933411753926443855202816639286380725851907775244178700615181224738149678115515532036949615027705781227353705674638130477867438347594330571063388793205296221543203426414555756997969206677062888037891075847624816080415461691756100642361866570553108949294117739870763020084856821290330841845352595763849009250436351761344045622973027796642436003528915657835410993956486726141538503689398316092102291989209447808278319789545771785867532618547823254104115774810208357558450714915494332596159655898789267574278189569580092499153548452524907889767379686158389016703166586069645781318942806511765547557193900955699249588084413892989632785845459686596615056953465739432544564632704520191139809281076401308715869763573753984869841777308249948988575350202508291344862823853510362317091574932319771309465920197192472774427260317132213846519092476969801056162408550694631830108187122994676983802395693527562522321753987386905943617480948439590060789533984149605773469544953373289126401886278508029668402844657916", + ) + testing.assert_equal( + String( + BigInt( + "18494026091674550628862727628751858626429057283113484617612022622845683447664822378851673411646880512215491312288704379012765587363611289300409460265231357682369191775667376806310104378410034761933177637286550700730326434220936800588803083338540902091554329587493847544365517474467351793656487532322715556956574215058604498816425838519196621305913599292437332570428890037541002037790815499742542554383620099864612384732137478159800366152969398901718941570584722857850163773846680501736617112356346799962794923522131559799657088850852563353156088679268525835724385167512538352062996811796333870197616751893264877349445" + ) + * BigInt( + "1780552147197561100313977721837658982344587734265107125537294262169714551152258852670966624841709265782199720558334339739991193627252684173355265417396083066922316256174858986487673948316222004094646213231535715650326024903409727104820937754997685459290803309464693876721877902795580742196476275308501581725037850221427198948814777682751577066728578896181354731502999019841982781393972041861949583870219935242688446752697507322892050144906575387049327257080103493997582854643156355355479637821776733410908533508370707102659798001669848183805468603554628157269177132902886526444313791287316378148932235413387742794549232337901459904267089986644634688998571800974707318469071255600231388727244784764258962946228923665031022876740533883340144188927639951168142480423542694799520538485644201303142208999728496345438860461649149771071321657786192467827941479207237663617768088956757010868054549749673389380188077921246697966010898924917083134724873038955661763670688182816533223152971630976191779661303652834436504867574733289943880736641102013032657983004580105599136568596881008492162417497271322514214958467859146411271334488486881753647227426851603235294453337195163911364610806832166375746033611544978230267817918065094431543640276700603820144446624402969766626915018282857989077125942474262760165008656143460118544243447201582552161852995949652262141571105193324471874204983514494023155113644414491671939045572246390006577535860281459806543216987588242100861430398594575285242048623872194444769942065292559705864377845799861583562548184557823197458491063531118860473460862112596155277019289286272002942543403818604605197897878214330703329870251526625451314922413706794395655880073867670971289460382293535397261287188229377688024096996590781070213674875884106988237722791997394834865169034597736875863549570694914857893032754348113911342985657610030036533830064872443769256500495028484606985440630603324863331750019288944196177474318646546828918272930808551524979269141604820728690583569953651893343230813488798362322215861386036005465153162084936253977979927875424298869201161493847586046252842276924279115926635800468624284712514473143586262494066487851156270355785985788408476902935164029668713373360959772880450241879091834565900469373971901027180446674054822121012699220901272813000668858662929171942990181487960693288484923451879958448608968665364425379420489229785635921950187943346071618087940002359002999836267426580253588296218112663997753385694287332068461541902419251475640685861524476765165596984668163655564899948465128767912908259912879459458988854848467043182319178435731787100347777436241103730297415433140259331871452598317336262451128855687979775530655178928632533609358386142300408562475159" + ) + ), + "32929577867858840091388367091764352582421131052085278162083056908571132893764306088283587539729988647614095231890302435494039812075528945348723910902008141964767110906252853299812131143284884525463506726840796026186283017527990173236647087906468573087925599740023455251203370960218830008651672847573414468866493081402781122199724373516758795257498123077876831092561402649235464588512970911322281373859496062597782656303084638153737784818490821663272129105363958062653274297872409479534424088347515610343033668035389306108403736103622764070008273609871112575173900314227833940413510059377705988799493494288384054796918689396702502998396026254473933699954392868404661437402669508683011821405603677533394463701119978095904618547872222351298004687047827435008335085322651207249012044360491984373578929213321646222424405944569891222804175714695735328046110574630279928176640230124454467631040688276310051399447139568190279173633249689487692316715856514478472293466985960653987726453848762164631512893359197815625715709911115370040820920051036358003929631796202024528719179777339585719717102385251830852528483962320306865175814422152894459583437654840526447842667852224710502390348709542205772113217885464754259469923952871782280631213949703029278560756830889566254680399932675014642812115823442064691338220838585870539421631671877875092755583678274974176901347486322604918260582204267526171899452938159455852729729064201251803968621243256939567451873163953498672923328584129310974581622707518716195478319095018714630721857084583049032747188463855868508906362449992343452074166810273162536148289760072711361625591433867045677273705445700690879508143979109737888443891641185698295490787894435103146064313205011939723943474221897953930926851707200032492533202830365653019532399902743320521162526149055911902528489845360052036393813627998148200729771166371622315470279610849684683267526821827369471777041887676725675829130285480160540229972546217666272773657681504012064608037079179932498032771218503883338114240003495467890449226716150424681872915112768570496957956028776510208475530270378118380155229560175453706196333787323446090955799870133684924755407371939567953770648343998630921710437869242478390249380227743701110135966503351962055346845890069798951748775776526175144699865139103957396322833374096320910838682787999207619150738819979695720679409571278670117536325443701512564444260005839569379245852151349302113652571691026928319533331213629454677981171095515872482416773733087795885698143813124004323963745710354978701296158755504943865927796559787605883672603784632460790079114615194970659493703510181772033913076492122744122149841822766957319631428168033241754931971023535342499404856224084341819693062262054693837378725332065284968045846461406265509487812968962952569161321523072951062369487193394265586843834880600485988792394729622614118786199060112180669478500338142891085268855202901147186477487841408600142725469518582189469137736785285329396134530057976319100419701282430344984630663504059893886888045248798883234925932019182772153925480329780624040274681886079995327883580262153121571827136757269778748515525700908423150930984390888656876811382466160063014678732744260818192145877274169560929220559309322959410322543881855155603454401914818622206462290254164185632792070890714377640104866971636893694989804574936755", + ) + + +def test_multiply_karatsuba_signs() raises: + """Karatsuba preserves sign handling.""" + testing.assert_equal( + String( + BigInt( + "-865271279785849942368253651204861452267244945858570207253115792527767938735831222664447785226772817161062744519554435825317313062192073890926507825598403915811252156274647898913157733363192554523502018658925442703996844848237469488793021707792557611181398766893076123238624496997162372227154241071325568560728026920471405476720017917691493454085558267248383695254706291743786052798872000286091258991990271650721969003072999510884572070705367838900283738365349633958071132642394279106709349779137597014176841302210010962060448395028935178916596215966034396823311597645059626693494543404467574507654676165400819773024537765319805985634267170442943948075956778752953999752516159000499869308628324000911938831328007911361271499648740953630968740550198178490846398630567748683163208257132269194581679533595686862649097174380184866262660784562567100741794934288764676496880877047387594316024839197144209301935896561780986461084311391386657076269757625550874165055877345513256980848652340547512810033642009736655496025334147348893482707547072986338647020452391395798143830858287806992696423435089987194146824266287053722976188883053717437614010926387034702794696351447309649109402174246894718204358513468928061755493037615026521127010518653" + ) + * BigInt( + "1036423860383656124749344497722419065295252799701784760972620446561680791819116614736681107005762743701633285109435609623654215830204500147752368317592604944308718371955112248176915264219180359643426627652569089884662842066624516646254086998318458730194187507941194174168002949448878262840166123357410245372063172135285771199124158341426312600632835885186311799750971425629178420293206267609270287104055034498027057408189300386889949857701192696499507120311492238525544706951342608506972142190757810712918906622545501770785092076379445760269812792802054688931334928052965487677456534004844580874244175498405406994010409967212360023246153935145822796744513476109844989636918790582559495201578696909535704199860398867472253379494276178584455326973202635066600367300869126294199055548174824479780398517332590225185855386480462115864650531647561907518237221123272480131236842344442398482339633971707364763021476223675986094320256635899037421960203336316952338227477730417566953465240805118477115247230330161235339275360044338359678021111580619335151523048712156620661692035138233458044869190750614932662927043351492724177703518778758243520480287127752414763118768315639690186570416753073110076606138652469239469568698440401994483474091724" + ) + ), + "-896787800074757196709628002120226195545267737570909107998305142950257444562399164080126902245712679656405811391339727279658037108571965252038852161314900076274713338999231193951450305625393589020788059778169741141226580011858841709399617326685455590469460660663244233878432683661594165833118376401069069745354087345833686638082566657378359378221768731777141691011263166958381309154976792538831522266992752667995135313004566623742392376629544177356146794941962591687606792285835808215952286121549038682576856406506249864706393082693186682580969458243440348556408297313129219865689806838294002472978517378002986170426601132674274710302970865128717254158470320352695896678461169667953766541867595121513601115829234401267356008322998932263224045278689534737130401199469577896725635460631733680216390458787548138698085982417507179114970649703355148967498694224280620080543002453849626074755148364024949200605604156534785468070229167837428313795656311400654886449799598875620117407688592459662584322899329107364163161239752633919306984341421605786192759404960653583303008581417276643446896946583821549245344642635175943085593786430874776689903793190007285126233011814658517338126985780168593582526346521066852018453266520226064535477821400560497771566475484641602674320118452465818847543601796926497349299395107520163953348667792137422835601280552161484936711699483751896407881050791727956533392677361592556117258443389094375200245317260993517331688965847131875481687670876260931040705215071667557188442170042855935884811586657070607927790764000135494720131283796912302156228062798542171545699586674867964654211842607267363872647628516328349125841533433422755535093163403903050629418364071663319504227703857409828813156769261565791396897637425845524063787943340452298995417990172371303315498817009717664126001636038532932041584278135253313673522924036327231765631175022764837054593112693474468161334204782138964668093267668108775556578177848906640134180906080075540980035250371040336819370280933016157846650228611431108517002866633614081663918680749823138279654715406085720155558385081039535003014692423885798434074982691777238939743312678803063033847024224910599517960236987319615637853294718207117425333688585832980129510907344903373554497334005216551159033294860546172285094057481147650830582937005806588149868719003105813803141516588313794220380349339293455416849575115664291310789742508835636437617368727754654405529332025385697505498539143197943808301431153334927772", + ) + testing.assert_equal( + String( + BigInt( + "865271279785849942368253651204861452267244945858570207253115792527767938735831222664447785226772817161062744519554435825317313062192073890926507825598403915811252156274647898913157733363192554523502018658925442703996844848237469488793021707792557611181398766893076123238624496997162372227154241071325568560728026920471405476720017917691493454085558267248383695254706291743786052798872000286091258991990271650721969003072999510884572070705367838900283738365349633958071132642394279106709349779137597014176841302210010962060448395028935178916596215966034396823311597645059626693494543404467574507654676165400819773024537765319805985634267170442943948075956778752953999752516159000499869308628324000911938831328007911361271499648740953630968740550198178490846398630567748683163208257132269194581679533595686862649097174380184866262660784562567100741794934288764676496880877047387594316024839197144209301935896561780986461084311391386657076269757625550874165055877345513256980848652340547512810033642009736655496025334147348893482707547072986338647020452391395798143830858287806992696423435089987194146824266287053722976188883053717437614010926387034702794696351447309649109402174246894718204358513468928061755493037615026521127010518653" + ) + * BigInt( + "-1036423860383656124749344497722419065295252799701784760972620446561680791819116614736681107005762743701633285109435609623654215830204500147752368317592604944308718371955112248176915264219180359643426627652569089884662842066624516646254086998318458730194187507941194174168002949448878262840166123357410245372063172135285771199124158341426312600632835885186311799750971425629178420293206267609270287104055034498027057408189300386889949857701192696499507120311492238525544706951342608506972142190757810712918906622545501770785092076379445760269812792802054688931334928052965487677456534004844580874244175498405406994010409967212360023246153935145822796744513476109844989636918790582559495201578696909535704199860398867472253379494276178584455326973202635066600367300869126294199055548174824479780398517332590225185855386480462115864650531647561907518237221123272480131236842344442398482339633971707364763021476223675986094320256635899037421960203336316952338227477730417566953465240805118477115247230330161235339275360044338359678021111580619335151523048712156620661692035138233458044869190750614932662927043351492724177703518778758243520480287127752414763118768315639690186570416753073110076606138652469239469568698440401994483474091724" + ) + ), + "-896787800074757196709628002120226195545267737570909107998305142950257444562399164080126902245712679656405811391339727279658037108571965252038852161314900076274713338999231193951450305625393589020788059778169741141226580011858841709399617326685455590469460660663244233878432683661594165833118376401069069745354087345833686638082566657378359378221768731777141691011263166958381309154976792538831522266992752667995135313004566623742392376629544177356146794941962591687606792285835808215952286121549038682576856406506249864706393082693186682580969458243440348556408297313129219865689806838294002472978517378002986170426601132674274710302970865128717254158470320352695896678461169667953766541867595121513601115829234401267356008322998932263224045278689534737130401199469577896725635460631733680216390458787548138698085982417507179114970649703355148967498694224280620080543002453849626074755148364024949200605604156534785468070229167837428313795656311400654886449799598875620117407688592459662584322899329107364163161239752633919306984341421605786192759404960653583303008581417276643446896946583821549245344642635175943085593786430874776689903793190007285126233011814658517338126985780168593582526346521066852018453266520226064535477821400560497771566475484641602674320118452465818847543601796926497349299395107520163953348667792137422835601280552161484936711699483751896407881050791727956533392677361592556117258443389094375200245317260993517331688965847131875481687670876260931040705215071667557188442170042855935884811586657070607927790764000135494720131283796912302156228062798542171545699586674867964654211842607267363872647628516328349125841533433422755535093163403903050629418364071663319504227703857409828813156769261565791396897637425845524063787943340452298995417990172371303315498817009717664126001636038532932041584278135253313673522924036327231765631175022764837054593112693474468161334204782138964668093267668108775556578177848906640134180906080075540980035250371040336819370280933016157846650228611431108517002866633614081663918680749823138279654715406085720155558385081039535003014692423885798434074982691777238939743312678803063033847024224910599517960236987319615637853294718207117425333688585832980129510907344903373554497334005216551159033294860546172285094057481147650830582937005806588149868719003105813803141516588313794220380349339293455416849575115664291310789742508835636437617368727754654405529332025385697505498539143197943808301431153334927772", + ) + testing.assert_equal( + String( + BigInt( + "-865271279785849942368253651204861452267244945858570207253115792527767938735831222664447785226772817161062744519554435825317313062192073890926507825598403915811252156274647898913157733363192554523502018658925442703996844848237469488793021707792557611181398766893076123238624496997162372227154241071325568560728026920471405476720017917691493454085558267248383695254706291743786052798872000286091258991990271650721969003072999510884572070705367838900283738365349633958071132642394279106709349779137597014176841302210010962060448395028935178916596215966034396823311597645059626693494543404467574507654676165400819773024537765319805985634267170442943948075956778752953999752516159000499869308628324000911938831328007911361271499648740953630968740550198178490846398630567748683163208257132269194581679533595686862649097174380184866262660784562567100741794934288764676496880877047387594316024839197144209301935896561780986461084311391386657076269757625550874165055877345513256980848652340547512810033642009736655496025334147348893482707547072986338647020452391395798143830858287806992696423435089987194146824266287053722976188883053717437614010926387034702794696351447309649109402174246894718204358513468928061755493037615026521127010518653" + ) + * BigInt( + "-1036423860383656124749344497722419065295252799701784760972620446561680791819116614736681107005762743701633285109435609623654215830204500147752368317592604944308718371955112248176915264219180359643426627652569089884662842066624516646254086998318458730194187507941194174168002949448878262840166123357410245372063172135285771199124158341426312600632835885186311799750971425629178420293206267609270287104055034498027057408189300386889949857701192696499507120311492238525544706951342608506972142190757810712918906622545501770785092076379445760269812792802054688931334928052965487677456534004844580874244175498405406994010409967212360023246153935145822796744513476109844989636918790582559495201578696909535704199860398867472253379494276178584455326973202635066600367300869126294199055548174824479780398517332590225185855386480462115864650531647561907518237221123272480131236842344442398482339633971707364763021476223675986094320256635899037421960203336316952338227477730417566953465240805118477115247230330161235339275360044338359678021111580619335151523048712156620661692035138233458044869190750614932662927043351492724177703518778758243520480287127752414763118768315639690186570416753073110076606138652469239469568698440401994483474091724" + ) + ), + "896787800074757196709628002120226195545267737570909107998305142950257444562399164080126902245712679656405811391339727279658037108571965252038852161314900076274713338999231193951450305625393589020788059778169741141226580011858841709399617326685455590469460660663244233878432683661594165833118376401069069745354087345833686638082566657378359378221768731777141691011263166958381309154976792538831522266992752667995135313004566623742392376629544177356146794941962591687606792285835808215952286121549038682576856406506249864706393082693186682580969458243440348556408297313129219865689806838294002472978517378002986170426601132674274710302970865128717254158470320352695896678461169667953766541867595121513601115829234401267356008322998932263224045278689534737130401199469577896725635460631733680216390458787548138698085982417507179114970649703355148967498694224280620080543002453849626074755148364024949200605604156534785468070229167837428313795656311400654886449799598875620117407688592459662584322899329107364163161239752633919306984341421605786192759404960653583303008581417276643446896946583821549245344642635175943085593786430874776689903793190007285126233011814658517338126985780168593582526346521066852018453266520226064535477821400560497771566475484641602674320118452465818847543601796926497349299395107520163953348667792137422835601280552161484936711699483751896407881050791727956533392677361592556117258443389094375200245317260993517331688965847131875481687670876260931040705215071667557188442170042855935884811586657070607927790764000135494720131283796912302156228062798542171545699586674867964654211842607267363872647628516328349125841533433422755535093163403903050629418364071663319504227703857409828813156769261565791396897637425845524063787943340452298995417990172371303315498817009717664126001636038532932041584278135253313673522924036327231765631175022764837054593112693474468161334204782138964668093267668108775556578177848906640134180906080075540980035250371040336819370280933016157846650228611431108517002866633614081663918680749823138279654715406085720155558385081039535003014692423885798434074982691777238939743312678803063033847024224910599517960236987319615637853294718207117425333688585832980129510907344903373554497334005216551159033294860546172285094057481147650830582937005806588149868719003105813803141516588313794220380349339293455416849575115664291310789742508835636437617368727754654405529332025385697505498539143197943808301431153334927772", + ) + + +# ===----------------------------------------------------------------=== # +# Burnikel-Ziegler division (divisor > 64 words = > 2048 bits) +# ===----------------------------------------------------------------=== # + + +def test_divide_at_bz_boundary() raises: + """Division straddling the Burnikel-Ziegler cutoff (2048 bits = 64 words). + """ + var a0 = BigInt( + "534874909190870423331813335836209685047052526163715248191397919142502923381166978347988559637181091632996141400815878963857956172856147926565367520963511977029048601199902593228961608526321671655006824541790057413975642667739308892179885939712659311211653368917063195387292696752791447884762568840317689936326903492504325211213443053778194642963312599425933484400093432496690765384147931474955592060888803001149893561980708220006590955728370160605386687441245678406571943546058005397346924500490928117589133335547782423668263863459328436835400430293249237565185979278225021379045629654028813985004560369133782783797881911323097603316435001995685209804055240993054071189891609083907730591623509224095963304373281367919298997980910045332204634159469685005368766147161377844603085583941270695489511873516573152476606624067014553337255788249245366863908568526375989304503388324834370222820714049468487055506956506140639082810809321873277007607619226162327022604321280814440865709931149537830072216230403627646237849281191970892807284502351302021759814071511142455735165060055058269801484254517570156334460694480049742455273080350719420718841710072336880621001377220860892266524155091556935416155019128784022408442036310139069400982217072" + ) + var b0 = BigInt( + "7371623563101005524806862520040165716158110564796016480347904769627325495533106684253734818043001193460659687016638112103528737576233878308384487099136075285376239996891138994578688511591808372819053668004598676183761931556897061530399429181363529900555332873585721375896912239980199658454870010230998189882339008700295990465430509133899711002939693181341119926336781690629128298087171311773878603796842173745933187025457598854177466585198684313342458956652168054400999394656621209026318139439572189495469216473798527293031743835026934043947792051049600239169811251692831706234275468246433879835875431513947" + ) + testing.assert_equal( + String(a0 // b0), + "72558630349521769359791812125409635972275081541830028715052820241510641031209913584632482841060545668309703239799366094129468622703025302446854813471696641838266620323232471198240020061248472051943277129795523509982363840189558428040489674345752447812386065406152983782854749097242170632927385328173979377014400240944441334460251867794589536276951372676356077784739151615976060848140386235182134109035524655050202007387279005007280830536178512255065915071695112881261493562246241053753070292799720165602342716776174642251623294143836378416958345901946790186960061538366687520944806477498055314318784747773765317158341958666790", + ) + testing.assert_equal( + String(a0 % b0), + "3397225141752396766535973360599962246611219948540533313868028880603577924972451657176662047032660824708661203286962405202601932175351753176886889661807819112605324448235796870225456673004539050494436128907536318091051953927150434499174291002546681500126543316407407738159687677200607797900574085707782722276584505442928120524657742925427637034293698189437246139137309281174636809599982950216943439919070026529132841200680027235398519435260048130669634980188965701004701409775964119704312242292786985087392007369649213017527082939148103788294375587932953901464039259116801530833281343164728163418133571496942", + ) + var a1 = BigInt( + "576592373074217131578576874671134832860243048180305592598394596200056798444955561846000355451067698170369494574688640660041062276840759681220222299828642864086003149591891353434228022756349111952735588416178348728288605377342201779872310034149287020956134107503176723179435380549332293270627568418670260415112068501034863375961892146550160220147083064011225857861065295033729864179615206276487462998938608199300686087916161064020137169179173735845601450169060991049935041138348147623563653024819634492214771061306075256838215723523199653261911150340112649807774692698323922908786443817886586437242681117653656542826997301030677753117191753577028818043951429347038397184001126083735515341716969873244773347433628539748105201723247669148326623192909920945945827498085849856649684495248933812580193527808461441608826007570890943414366514580193950961032857475899493820062529247738886694685985841029916227164348707209475569148416757768948494355618498986487634159257263097932388317278893564744329622991164478491277478115842866174106048819295013358342996346641874306713453076241715486226499893802522721164915298188713642673163982582612442043242056852386383559263590422239801112902599782621677399311922658010067641637667534855555195580768539" + ) + var b1 = BigInt( + "29640658864654978938829324370002341520594610742020853525226497925693630699980174345265926150359802221152651486225207262827364788115941555561273169762851353094075533672889725816619764343169501318286760188475123300891783131865396259137215566056711418623036030550465830577007288203774624818831071361789711261276191145535312633123214926390628737716014290962015481747259336572543079777636940196524018644124253812525131993810794867190518054539843664537614000140006708237269393591987133598237875755644849275711276701048314517404576906738389985138695468169044722520611495991901486570539243236721386681171372087773142625326094" + ) + testing.assert_equal( + String(a1 // b1), + "19452751563554987142682873554107897855334046233450458422644330289120156099429474440394997356385247262162611318324719768901278546915540599762121162619791580292855543964406956610052720767446142514564757588219088930298473758366624072557275731684440464797350248877131444625934414023027179556277143392909165927213103686154366156700873714335034159877218690549462660248897734421255259078433713466485144804351320060409154482705958903486734518778930262467223010219108051349913373586759197056180963702973750301913802578654539228602567716685098564636311716086369952945613249045368653798939716416216509974335126084552885145786113", + ) + testing.assert_equal( + String(a1 % b1), + "1509590987106148051232720200189878224807639131594274205573944075420184965327497578363108257935082061012799739323509505616398219232084850672581860946055551791469593385386772298916944079520192648803976737316656456739717686162615232712187347180347797953564986675439749737508120381140023548976899132717602220384465291918790632139243363495380516281827807310048844412523820709538370083073817606389469692769168549496758556322590872500876190976969434065728404063379910898842087302860176783045446661423276466558496236577869484130985568938935464786468996949324906330982575542211535935430939681871087991048754252933098979035917", + ) + var a2 = BigInt( + "17762420290404551554414372419437404116434390774857833175348634282486830650335301137198256428215099328227330323886972431788068583568980664990426139918250107969900151853931458093269181321167815947164677400907506444702795644075528491801242145085828909283700241264159653993880206411885415074926005298448370713106610247925339764687325824584970120301508453950560168035717020756741543536545622502403838095131532692579968769428415271817991036661391497807245865404567229888341913355036245710026126301648658139772729056060951527970590311936889808279023525741663736651525682030153862124165744540706565320043918817936953836961820626759830680036686234842161266025525570319179776267143534948910332594426145155584017305067021620261969422340699551031499592038853553104586621701802675238903922818423887895419820370042251397320765880666740994288486911564639053851780037033828505599718061313146889771376947245612978004426756833288278564827081074421689811855974515811783807328482441442419581478619794663612635945968442790299376673500517881987041078600174682098501830532991959958808624070904188781287231945378531160077858274526295788392253947855483926980990611160710329960633725964044793076644638528209564355213363115416369395436832850240072539081122873245430922709464802930609065192590" + ) + var b2 = BigInt( + "70847115113705018192109950560471428338864076589213850481614115491218703144697133708024910245197317508654794100518634892712505168363217511841914296238473496790127893602530683109410140503098899540167410583636343061351857404756092727707571666863718111027163329357248158948528463117419377018052176132802855869454088190068551117607640092904195692810314161840822602830645614909584099719416673007242204515640456179419355215835911439192534846497738991214344179196778973975726307327990093149504925928228571480238817279301738985013390925935858828208077385091863895373100204698695932650274811185865967383049900403254358870236840836615837" + ) + testing.assert_equal( + String(a2 // b2), + "250714799916651802530847909560868258897543986564547423299847599122363973611597904226203321376837277744692746279320277704118137234555585442418173543731863294352200397926172841821031565925440008789830735468145340112646533936117833372195756285216289142483080265861817806966878636537145150637775664662347273074073952036579648344432883357461358044591820268749125179442417201617224299673130371880019404965107069214548743995642158166685687512009968479002045985498147587155573152410787124201288996682905754862549332320095884737243303900089338603736971420111249744870970314159619862120958789720528638552041202980104170218960524596779790537192792473", + ) + testing.assert_equal( + String(a2 % b2), + "58587426753986241326267550939375319190311372767320098478162166952729710978779065176592836949186469520214777912073035888159535890042297733589338860500437059683027899540713709220476709566488958758896137088966905463701534395744812279777179816809242474648870794304239308049366773243649753269185380915688924102352780689895342818827007165360027682547887675900330375499279912529788935417342767108315643797936710552759222716482518811016149825485947323780638800159211460825558048107317897053165723272918296927349752750889773140733954870401624649327285880925642869755336000766748505250614718347266269149636431553291973365397583898997689", + ) + + +def test_divide_bz_2n_by_n() raises: + """Burnikel-Ziegler 2n-by-n division.""" + var a0 = BigInt( + "928561051708731337755400534907649642108590326834164487899081866603810978680191300617364817995902020857972844571691580667852921110758852474549635056485077109073163242278814855459417423309545857805628274386606313854595191440615029292293189657919894465836388083226912925981634834183938592817903821418439129410757910274189476981168431799639634033219761598915656240876509352286287923566472092897768266602244577082233315327900382506051937043511725223834637711184795663143877319953382056369078170273882619948449065174129245640057906585070983081026653951215872875432850548478073809087463854354613022601097217642355171775966295152941656623510155859257690900641560744645120833747752942016530362830057016379683370565093038878108892765771824331856397267327916125534029067049752335662589531951764558433255906886403791336514351460125910292512131209825532630212376732834126972221067309338076339407725431017251606680918641678045872761203787840645926530772248795410712901185572528804844922286348297509445995663888069633459675775318866429397619096499893507297348299998069405847455700054210333153284507504397906038326473771455643091898459764961267929084059289214570565051155407014154747887914899613410918587168705015900418800668538143104580845964787656003044905483807317518187975690510442110228324490802240420836993126899171977748961470983969796292569919959296339243008944979228370919611422154110778168760463026662847771945031048352840088463123973945829391954007215005161576956554939792096775359387979267579019801410855122571481838194056330963221866354418025752481434410955078675243029282891517094917869771445635389907005096919761756859490187427042420744381495589204773195653278082358736258937106192153858025598004020383110188948797756551220648025013379249361715146839877414002185227370512851358219587387255999231350700286870627494470356366325165942383040513495829166732290074244474195690408595430410378697264528401638488053203481765685805906156746746571594977927877541578780432132468976011071550673590806023136124810329105023399484827441313997446866676868222807625600864389266428499334640782904633811022063797089124605694762969904948609096528399784126102508828278321792537621063851222232490341726495143603118820508803560323054080727544158772650751359832704922432971956876838626908004619326640766419115259204663075294256684849442230001045958448788160925643035693378432389464644725015540766456152484357916959953968737675131597530749848651736510416744336633557248526211115434254935803547" + ) + var b0 = BigInt( + "897924448321776909537233474400924594850671294562174622064492600478902668083901394560949305129705475976386073105596989239373759414830165768692637611747990944056863750011214967817372330740461654226851779140870290222603870339518686675789558135147981149243533125723195822724140248540789081335873747624223695012096456891206956145475451077509036650056220691706175201286344385371745199326372950522801408943864859484356318814224468262560085140122327172933243449011063083291435872682935823433143890675558242330857107858244192648268074691338506810728750275754449402339320600536880051629392062002815513109390261104048398092141009732072619864737133378670476350741360829333592398013814844002175151769666199958453219692779731087830221345369794624131489035010745181801919178791913488762661368423450749067111764392641830444624999695124639043794938517427999762540951028491214494645703291427925375115452994717476423917408376501496569320379722503570675457547108062224517506575637844704883814721366074800814449603918128253676544565760498173196717259247673585670753518162712301436080858557297236892488080449227238409547767718396925316403057851760751702814661819342159369026143488362178698453086093308665269554203346806561562634245006692652102746687016103" + ) + testing.assert_equal( + String(a0 // b0), + "1034119355413714726562094297417508548699926720176477266090523792950897537179400109072637761473790249949108718629342355192875813863854977945584922406608224236262889872880224016005116354405673262626299824425120703117139064488927786312730375345892726764329264691841186769150836007832715822788846983160401183012309449500451100995532831493535422417723688349059453128850753527664688950681761699322109524118716166189758967621524782049035104629939603088799251279085280807406096712603668902312071527939702417891852244078555843180551830050643076167654632003601552893309839331602052805531587325222915307352982176198314101130039060943953393475772879800252116535381134351891885527990277424341297361017974084169200135743925273580585294913010059850746618255909764925997786265426773838188599358235840533793187232353596867254043054389481354086074647307221819404471954763786837623068787347838739035933306585063686037741686946492834598679387947173459253686572851929001945540789902561558038469610551081761285521722838673169464605586464898453879600609912352849274141932742697034969170299292333347706433020703175473118962151717566020291163867108283759427915990553903280330244305447091430089191561437201471072244109431795511548565788533107910337008440003606", + ) + testing.assert_equal( + String(a0 % b0), + "421850867838962743135981565286416035253282412969628532616450645014138786501537502874627992151250752443317991680137266968262318764531979406269976646033465682833947114949835434283439151054500843176486805547660015695341920864569198528144318865515844761225987359243591282278199758719973439187472325100528159261698561241421530969794585287347411343435204587609434937032713236105881573607313226497733642723093372566207457555880795368481158748904594567707816688538155689938659559069134172303934624879996711000551652118181933926641265138059330989494202222962363773646749597451930554477519471889936039478011799085671269052953175288009809590982494158524094881060901966667995599646474033891968640113714959982935083851762253711813739118999392955912368248820417035297525136565327127452746418968346087783054849494004416549848820965436427096094757102506423404867922969160319516398789476326135923167213542871334224411324911266207323468782127388062709663703166403036752579773628084679923724270113729267283697408709304310978082902796357012577475402638632076006901580965480992558486362578374785953657541585650275870735193608655350757226907357592666375482054314764519925273139260264931023449688605682368924449853293867195191766402205126437802792235736129", + ) + var a1 = BigInt( + "629197804706382914971325045008702132462795438180126809056075682843049415804485356863917486223426684786831034245341635387010220033075406018930521676131122701786707737630771239986954330535927940907791080775362494055484217146339232445325214742136586077456221735346524482607803952020679932438481690749930669219217062971578074682765941306250531565673174661897101129836939493986101573776329928699662401857803242783316551568453095493571368581631619562011360086859464183277049479425470015869359085696319357499637022074290016079338359919651435736100958531180412049580254713962543408721344829067046578584035704955413727640030777032790421367290073167243762130048473514223322639134962131973077366560440624227294968639206801490925132122097531106382251400170915574275697310914906769429746986099019652334141481902895953596901639381261728724810343709732266207795486147749981521301511295936867290228454693975414409265001927660499218322185528887232628138649292420258428402648537930500065568405012193391847596072159283597618242814858795838977754620293053261623557429692741990938835045165671436199319013154097273584093027493643278177668363089630087321141010567611845857296699704514289799749252653744411293039789418379450338130483935315377035221594896606934967188310125600389893009615016127130747248799206712866358738993996051214164638315648313106938438294712166445079566572982813077233248483948227712089633847813552494510218859141760988528502241112633217491369339265996936480439553998329890423937540003240556370727197513658021910194047397483775241487616322805384457237092837387255202180271689899946783959791891975898836910656092489253950333747988852773827479273049560763058352747984748431364387422059133325692668374776903056039684139116330569558339308259302454904858939763641062473860331687509154773385049309919724014257981149961015021342864134442148079712519579681913739376086462204054141696222056092545470417486221579536405473833338148766541260378976404964009979586484540365524625774060097003413159054809649586939546184892878194494231700814211392232916832183645219799444618762981737718811919188734580946029547410097857046512181027938465355116710906735552913128865866132490879544335526018025020910861088274584057357465034037079723727981500057306123777876709339069700613689554449170407201524084518051453258151632882818292127359439748954621260981406906828999093305531176413327524445038309853738495373585788204674674339509041191615267140531935333440228254540634588807107007436644814767146466323969906455811402915676192852070849964274544244743718951577425600248217423986526356218456396911925728588213594689641506521315478788234234303004289731459959237085777776824977940127149630234283286715326161288125072813186476369271974276678137818834034876824399836169957096865402620999466690850830490848748781555609596879333544194980114375994126575951104008669856055298643446601450561000793122407419834162856599584675801590150838173935169411956546964276741481244743236152045827423404161474780810321408664813232664583364647127662213628376088600804800434937722268199702236444932867636007533341433209211261414673573733677552410795424160014864574712742721639758357857266442210106094359126298489340645376667705033456523008044620947725153838215959269051202832988055995274856150711854959995261895206668885549157265874357517699996402776154255102204991842239419576156455580915320918379384883734036333065468871435440198382759812670776562884573302049112937081101305157195694408750832480440246116898312400350767954661428240913396808026035364897726365627067751882232327521663716226785912038969456914170102070526212838380876604453889238853527381290391214383471866533404808764823405026261418631711849667708251187302018980659104340098825523232133203530834965474219796478872773743472556814897830357545544965691007263615303234063664251525777536722132443713952793171834098015156877769685239848485728878121394737450145413722303832923286766728318447074744898243802817937354961152381327029136973170980525442555849857414269361769943305790542309399918773063023021890581743215937533542682411675634065986532253503556383884234011912977026031982844705992903075810264876568109877063943724133746912027415237364741072854473722367242655036197464345099159937935609857260096050363142848375664421161981239003580229382901753395351604558622732018465064132601743855622472341091461189500733597471095271722376705386875398911083446890409071261690898784486210455810099235322382648682879380075078117730189545129505801310058278125668016301835448275883539974924102056715281807110539579465441207868496035719232370604888879027914848398036954559960932572108803127346158941239172434985373136299261367919258844063680678058287346814910639485603203108184369727054482547098555767115967559085249031544336692931851558136609676647857470414442859673878603749731066333664668839587473167408905458394575444063089381047931798949691300257891160217809827065419504900956477177398558475043271099524284953243925629449638833557328778" + ) + var b1 = BigInt( + "1085709607819973067757632859258418790808746088721688054920031930821912295990377567962219809392597951945545814528788206661174048032031323305370841706345167146415934060971103458408749647153211126360858909259759889176981261496607061326246339189718865261033716911693979119466891877718788988967079594137189754489766416144064876556133793097003789756054584678605543328068434469650082527895675385143988409499587250557773248290219702217956474390434563748784715337891741228109835507653865595916379830405455651211556836923176867441031525446548131502427719401204982520001999340824711483602996349543258573893570085667330489822424972585978885017194483573474124471946791447556080365740773519383548133832309933253281319220388624242419565672262936478356325395560914128857828586080403234859435505214496868916266259126038132836308723275858033038858025087503304810171033159655595160019891721451508667307178892345196732220025178654995525727646034567004632396273434724334952258295341474900595257891416250190337400787851148687354866369583139281609803024387687116413888764485106197585006491670011205686112686741569872439590831161845470766190519673670906296091573143926038362473379377345644928271623524935189972107914046894571846201457874882436589724511061302984976949520467164411449620173990639744479303586593967659028234164033911269362818310170056092026236445951711083167194142516332566070408817613391860601044452146645325794378529516137812082343572114517529622974144099221529611622795236840791590749775791808812833449155364730586634392399390131659767049575619369323511892326628063071005692683079894341087525356801713672491441344156647148140903641531589478854081661027570036916761549320663198008495019363499498322622576558629421343449624577119165441348775810927345143890509839688200263210690762483593603545239224390250656869346163113855588023303359645826845129272441643623030132424294850780849377588809896294340922477195050503579270161473097047457425198814850551674054213195236282083220520904301715685696280129716374754579498244083531846221020200078385014883329372389442848715310463251673767661849239301567820105012954137336942476242706465721400018744988564923950248317994962091961910846211451302354320957071547986577244921029202689008179292870013091454211614307956206155516254157841435239001929888169425012441371454164970879293222064859848865479951314609358473841535841031001060419598467467546287301070804448672835843703932518575293862268795202290884952517437139680175587250690248872799971" + ) + testing.assert_equal( + String(a1 // b1), + "579526790750030228398160419698258474726925690331780151938713732720353539137121380453959368739781770067748333346173632300613183490599607685880324066327272407370001201834173096524994147380746106897719853734620814323022064643205893231875166977399552291119141928172349457771319876124358842724531126779609534533006876389882710736910205836667862717140201829989510221642231201285451353759753261782188200726367402705709616628126655966093192574375119822332799741876596438796268613140690179992498515624723064433648744316813770113171901304268098167123320382977590195402916644638118417928883356978590023472198772963433418867565553128003607901301695849682116577356593919935341633740805560201915023232068653117679608141814378895804698578071005784725390196127063280224217398424708144492313461181043850810036428092129441224436722687538997869653175992899335305570216668348966436129779087336161032033744253826975740892909815162502002999968834901352655498865372126397807952332952925056379114371170568445680129455195547692527734920093405430429256778020605941671977852608116067356533019148300330269277048739406787359856401745349249547181342182050482481217090515893041720190444835774359085361332100511041968447945435824421760345208639496781149513884511654390484254269586995519140159323402591331245741051361206945377076677450247003527549731464788454947443185303293986370028088540618250618259791570989587487018234727445617353343704434142343701175886198128657555875214504686203563759786946357134423063976258554704714514493162219891156731887879832475238212330266552255198490188087394418301025882517106860792272366879447640843963479430716447908909080433703960417632559277165938775182203356427064451371977866480152487659602116521021589770403129396441398309285460067788980518226637871898314100587172636214948748708242398277691086413136001191181363313888145551962424738715666659317581267333948759545961746172117981066558506689297215024799471450152205150051894275374126060431912440070080162199631503332523741446768528150916105693853481011661316604206316427211682996658798095755996262239256875883223363523404800575134585242329759939404695112796652627520779413844683965247593482651530532589951654548305238256068690409739405952703126866086222662544193715593980710178755580527571134663316388386590303789233554375974081954294332922698858137242967072645172311572950156113098097315790592092855393428918449611594003045008936965276170404196378626379632556404751427097897806976856363833082963453422212017168", + ) + testing.assert_equal( + String(a1 % b1), + "1020021626067270910553274335593218651029415749841000534896434752759783082008144807850561695947779639218244334187345201510387504349147511243710411435082071816375097430378360450277680599820204861997426036222247480172837021118994241452216872095141574278191826042837173172194988025865705743971444565656947759137840948394233601552236623382611753307842700859984079363477592786110241944101497867129927460476124064708144463913149382931408556270698648338149720618316674870975294297523247161390676978052337130511797224068789427095705537131456794470033227717116637541261575963676797127335390801890939590780497483919752492164820083119564765903163909722234275632788733916852582132312554348186628190345126078664552424315791277383387611851570814091277866714738270675083078791071896426837912577774642217609429435223474512576943239821900542101653115937889025274236535457498769088486980735416269072368078568542410479547634959591119028896786535958474477627597244285907932159405120256588262004289620911517608541054909689856125870453849164366287986352111373086666490756050868184595406243268488330194124215092546646355957799296568066048223516789644077477329484477528258427793280544885718568086130695498203419109615416534929086944447719340799301359527701446869611758789968476942651736702635645560564270309301035822677034645008660952252344570230473335315092975406238018868320115309748672107913569598382863805462400558228438251989108358815176947335359717712486207842758190570406337853343503810956372624824679338309579723555383548513514895071636233488691786385342673566965690204687353849307826828536401383016808898476891146607231024261910493128861252343920842969713238389876623864447661961831916411587984850534156856775332665368688625333541737667832306160173829273326861147851484928137046098301459041236086904466935782158026326216594617997079395116747866740288920157020457510136782190692443783319664863331255771554856595317511327694261426312366077467400664574341454276144509775433325005499383209127855457179754267957133925301544516356463909397568011916396591725366830107750528429192356673569728300535046710441507114573399840651804706647297544229164007975087898752067241993948315030729991135030990265988121594399655662485527631531904402866985760732690987953826686582555071552745035900455701030781222785219387368403898496108857762222310645477525279924424710134199920207147413585885191518005627381681671271710077501437052392513824212055247275097965420110383260064527591935325980056961829475426650", + ) + + +def test_divide_bz_deep_recursion() raises: + """Dividend many times the divisor, driving deep BZ block recursion.""" + var a0 = BigInt( + "1027024472013184647789136408541014477779899040466593761773521224736838535123661812279741231081026942683536803593382065832498715678015077164344567130820832247279579489294989723289696917873044964115346777063903556781090092655234247554468883703511521605213709033272638360878639651798980798073909534336255967592549238206929330717851163963608261001073061158061369738479436945412912237412461402201853572987389498654087852849792879243730242313473523683893697527644650736257551049384685278334777322344126800831175329325885084087281186176095675473287455075992553070954361054909726804640994752429783289600563184568369533200907610416170260299343476854844165426769708214618463589047222545482125595932379972106536920658861757414511733111455988437817815386573367964150183514449940198347429255766618913186545336079838739793847848292561392187826691324656843312540258235040866556283910828960531941634469041920376589350474361387591678434013002326745169029428900782116092150790882163666784666142184095007105925142149189193572138901583603224647638348656489665339243715660746177116969500428552290157102531576982136399569839436990929244280013597501508218332449218300502989968514355168454057273192731073867839444441764510095310866838504299102203605087405081833218061540793445143124265143308748261445431873660430344853839770755633508176084182014833443135211645470974503113449114820439514549470144921844711201031672529053308317362157591531535570059114564458336776458351250403805808210063278071724020539421791940491781314858407074570465073279413482428157881790951489694099821116753365650822087083066270158024054059307142195178471041550588456069037046542889949806261687787343402375743791497373070331912294763679656836734510606379050061346712851256016285041879579364592043671441178837108936033431663498587471933970728712567367277025071110590098447855213862079541865704763025223337224695474711428243261843770080204547166264823491673224964696231503419891217713048735548627119139494033938245580221192464060510213997649569041742419740124163080089557927432149525486326290530049371913469202899694472865449238761193875675686620755299110834931680925784274892494643528940038736767999564955425631271342188952332347853837249804587667432344583848669180767999961019329025356468911258007898871266127636937816616701038825614906721539034414439804683607092892129108744114273204642331447917534959600392785542658308732340044968339485331732749388953443074848609380444623946766399929318828087054101807080314937083933313462843015384870332791624697358662492705855621120003436701789483698105028172473565585822440430326651832256080871099435280085324569749274921426902937901839607353118416504959074281418054359390110391917990435299172383205751338666805822202023862270909468344823975771736133817492793930122439827444051931283522505820029694875531559546295013648513343082780523360561626272428534756555997229569447779340463387227144156004215343184319930147776666825541493865881161657329795821900900500668910455681913874829399654116846316950062573437567341678952168481710246750845105463265611352442595420163690539665125083415643000474621708441231300382007545229848244322524940885711234712652606921258684923238786921159688852974329153205238794501232920695107950167036369235346736278823861926398583513895585715768912725143464555314519489455095570520118843096305340040319878364542996706483523459440069709954496818495319583244408438954684760610064568949856669015552718629886388163439105454409476901384105286218674602718271437470538888582387519543774139743446466955924735999873764372217513214484131010098625002391520986327813086925885828767103190162338119250402490149588398320222300457061205680095523101018514414125466406698115248901697275406864621106569117153883310066555252682488967102961464124934221049078691806649744495981867978910097034723963906962626931745148083749446314574480614189733858806727030787587448335347209163826939841651158569220311824272545010793538443159106317525003508563330435487389582798028404628753978914092600220603799828087650160708047214919951795914210666468978180230307904183718063890688980908103185726232771120530315730208510709622387218808253863375245923852395496390440023370682704468816194860286721340348585323557499837629454811301461082258638496243682301324311398340186673578554210048968175675235947801544045812058636846114711277808872571716078386078912407963965042697051719801381532209123367436534872792141667635004729450171605996077024300192521956990413093004152311173489754698447219047898274830237422651746988648100104357727137779428604733844942132447452437978478903948941468046048177177871954550966130298999515296069075410346620940878098038231974062203518743272645670841402848178820669995229573450854624929225663910592219436272130117855758916828221246243631004915098363995618331949716814058840285614953144392336408514479273788717006308266574345787720072936365978621399488880369625543261451023067268567563228980477589992097297270943790100325805244715373801793784311868316284295867201037238108933331006635394147840247783046890193763467801773150138141247046572200007045424163364049564407515225516973892323934771237796969892248381397429585878081451246219682947917520401970307803639356171789492010505982672857090792503440570451774806552829818803857883787634959764016568109668704253777819813420480203303424375705972681954969192817888828189566715906012685587906689337023567677203958136090083129002822481685651806853942714352630598397426675000584958474084299955105875143995354440743301251925907063747504672449035200872545883914849934620585184043349762989972317161456031271054941939275935605808584663487451235878417828837853886503937552433705391193779828385135956977539698887242827800890003785436141562582990004566546073115757275783088754126812187071320614681834594059134154964740761499923323078246862262191429903612231802743806935610135172238744326624217034058955297567258385502894239805305750074285311036444901150791130445361217575063883107082091069791829729313434339868351228347120447897168449339765440754464643964932951170651950432834788153821098366083502024561923330243650216280393697223716840874523003673863822631162232828048072095523047709917632888714590735657557062360986359132805047671779898080523840705110544229232173846496368833082984473566387860413424118803342757223344169093143285623989238604214815779943243283145664284344730580486566621271807274054044076757491892362257657945209517293271012585187900995808617147677273283626686357428416192779874236519929642509726082415718681957564297627933645457481530287588749617502467372547289861977909322258195144219777132753760090321638416768632334835777256910145053504873061387081062984971851801536561254440001068336602633211330099990694970426238338865873600664947704332141320071661244131107707724907664383003494780464138071391994759372720548251806631445820843702966679555069114304240762016039935182642893028131098028512429886792910083611076159531004572622127904500791281627284449041713100965814618871755273552320324856145225009533970335334085740695008063608637991078257810652971744723917402313564033802677056403683049049613876179087239392276789820744835027074464867889103617412602113370341364361103899433329848775981627558903988637662155809414928767635762476637356098523312137950175134148673085746148867889962718891949135218294941330170906903633879787781675234802121216706121709782349297818087403989451602734791994383670072968165883703504920750992878902755548566538512190515463155478328594241225653509315610978185498887029480070065060641925991346022692439168605655488670506028359819487931285984075191729955813350984678486674102088480472132422049280688206236857141979236497462429243380625764567780106760745905285899234917040492948583368735419706109628824569393522847264180979453965123995024505197232915794770224500224541041402389894747324919556371766042096347061225210799821918396992963459415920321233894146707961411495744017027043709535155588928640316689499634631278445668995021710033678500221421148791838214164168634047919234008729573398131567546305854052702190916551100655371052092733059953873958073093288130758997940246162731437875607762659741576437533969577588458440178909068076850023650115809568515304246652604105660081522012078615911314280074270470037301888431554619695975383453222415976510551401472830299949183770641439194792966296177255666903843971107204450851696262809828605750085075792645332990121584244896896081681802186617584187523475305699259946159639957434934329123742469435008546973933484260680524808571306887337624194974550102841575263989442136499165887240393311049865990696539582913500357834987730713429946517648072812430737654845183421534075019203872732957296736572005247800146567805303519275768376288427351463669111392590533743365878040091713963883002091835173914439220762841976813706227811132565676758163650638386361088011478034882004585815508391577152202455965935036413585717903816840117316043827306599247133877948679200245382898917989149467966362566122556046926743719377964755855776523408973700022843782913081166992345423097343130526702851086460547699762644219236430568639208565393443608057940385170714006271553871622770413277544965053359570201646635328192332625616350924965139672765931970989364112934714475100891746441867402604572132304944587537470830299660466788466447657475798254666493712716670600645716829465748201672283286716265121663971081188380636483003719858074583043521141341639549596894267876766385420537617001328267455194630080808812879607569081311319831206715957356486624957738634192153563552171403759015873543408647476047604904635647642004642234641339632052458111838007548327130831235170110184096020634665684332372526809523130336021279428458647715325089115313756736453330467075378645998832997089154177399757081190592456826064322853879244903258654324107723356516238084765958452655899647069921263353091843744429013139089815180475596365081535059357893781498796426339554944045729481442240860447059234911178711511445726" + ) + var b0 = BigInt( + "879336303261743059695328645870784979036342530097384735204840295878107923346784262128887057311600625863213962614422394939728006914373398167363989253202483677196653374856375043524195238270764884869807399133524149340474143921484430743711519054413941515848875335557890887175250482340908897491659466752005988208409623866408191365465770694752975582984446154245944589288784277269067645708798192733136912189329544095396852466799466733038947910059780291927732872073532805138367387541138187287748136784660626784151174252659685960461797912031837986439901016007105422474760452484615184778387920510011253010511670807467193157559556847499678451426545572142529474028475788547086322908339777299233185334587342101073163646698094285554670755006333448896078684860352384417430963061829224550278992517863964515181378495989085648343598004241833343626738695034413203425112256381847735633999177578344275363334578326622607288129873079415526835409504758424393012901437060384941970621348799854363429902775833961647549182053855076462893104075460995224194270503659197186645945296759585583111024754259951050435118420975345414660742714035734878699420227640993353747873893994913995217569433862503459354843742316595797066846432654178923182943957407908717868479309082" + ) + testing.assert_equal( + String(a0 // b0), + "1167954135640275912437607730658701928487233924699735676830663665561526495404029416398965163948387043542417485849346113035605743688650358220736943076813544195757099598632190817852792018183151449371426462449053259880885386447074789729139247447602069144623115435202437777324383711331540923216928208470341175055091506892771807409514527721053196071780360772485021889922557798439106200987387446811378139768365375207965238606092332472038128718540190890667447306250846260874489724241339439395755508745953435228972166726411501543320017108563019635161007090506769479612661962475756958678684595714308263479443243532016520780667808196801423974734554546163970200605877759348314499810382653448556631847474851692351833374734180838337019082885792114084146214990776117218217398197197379522923416141003172119209939777927043786834292754816816900801898566415823085678055853404978631196715533435878454081499634440857417849936193937197176973492018868844687482562654898526846869040503110934572758976306431099183961324146875351170801904945992563572834582162123325237097631471320355555035211807698167645108229942474856656385397119395349282367911193400660062096470271495535211235132869866767017051985501687436590947091780233548633054685442700553141867324581757454511456796005234873598772928476448613793852191262965478764461213286872586109716023245996937177153611235950716952411595909014765250013413344146855682447090136210446824562460810022640454498962673496737451166863937132142068608534922705094511568262068393207330508788411845893996147111872266804862547141992533611299004825191821830001229589578662620319836526086601310335516157644077905924956687389876201302214601272184439566104983735161288766644234964203335693743534352444748265586320400038824004249366543048133170374557141450303734460360050307271152051084517153663385243770493330876140054574968193988015968485710015698543144821626412930435663521141333846153266936949821616452841213684219348225249936206000805933431323441659413308156438473998931756542622044492203803322415408179708483998810702591862144834292240915836576999111927621104712307972539074482424920671502689640569262149228122844990904297906595317260339896256730366231968730428849188386248784509451696443258407159795058825309917067293806812050152077559441029635675629115423085798734965925645709958661095551122774157785684519503067785163509548571058499707953710884471741547433688241862617631129601281191908963930698028084816081854892553219361858810213732157902083253822992355483650234917967343288423392624502243921543861769752523382680973675534856763109923172538708614359286839495414752928523894661163890851381894798445702066124903928075816161442378901315750782345211500699156416767701600809010272759993791870372956003802608140949843581618359526338939779097062656158126095562795212956750976020853153806293094707604446880774025115833598195511091579334946800218985651299631444516333484555156346934828920344147506649396021619595853700727249775462724889399703853412873992667729321664415011979713982580669949653732164770714020308921757103834815697666473857466288427324500619052827836693327881667222831893219111906930449999051717351512538136552162117938162850114985496081407534729337732175340561060393764384661479910962555621563822566139148063127289739631290636872898575965495112771077004025050712914784137108444580930049689610787510380552163522663350586672983169574059485671766538099531239581087404450798799084785209464408215925908097116575876753511213071904144497072445977785782805875347063119302901740743033932977236314582637188208888134255011478804909730102652703890579957563231778524888297051053535538924104645760862737775901946222863613066960500667518661693335510901754910350428310207232029969982607298959391971004228111504827410207916663475026115883869284893221182828122416462296181919390173849791905399358245939533589616003715448044575475177889346918711310485432145092787048475286875473349186516558134529155894276155181542342375007155030750063190435101506501439370897663244299785257241370865677781563787200187378668030750364434128229895614918488802813998363119869348580527768966321441820948518182073526688945468886358227093310956665746760662084775631606237634478886891409449646091057299429651291215536343957518695795485889100947322999486302939544155446841881956411311648227337768159142265086649854879335039707991743516696320566583735881680691990760277775183280850717000818910777630419483866546218421687039724681673625346773072631376145108749169585548234383475172199554320296230084804044261628868813316385095058507786263501884712771748500714614885487141029198549359652094319370587793722036152471847824485098405132067063870172723209782291867318751741460054973218326620349576060783450122509118946579747105634865152097357345506649455335771020377967344763800087624468152093560426134073857030437250964982855950907762096992730778503233203451379635165808280020450556982518485903385519570395885248646397630027054172580469662234217422138512538687285307059816692157325787981434466515092923684632988563401581653980766972780925609858007036555668528188914277391221022069226841733337029328864984350194737646995643564772685347844412508521561903132644965511856603482584748247067932717137689504555498753713777644887754087467134529137610656151986808767277932910491056930570767927321495690524379351500399825674359684925000637514710789798783321926714801108189597486407724562330498818851436792186471781294098156642367790918661872127733700896384574078908057130082563926312097880726956646793492076320440047750021956432759859806997853122355232256238320182633136957532219083577832960209162310182224869155694285598959294154565253238096250063429328040112289226443807298207313814155431235040736408633290905757460798005587561465045354988229235361441276014277008058670958966130194752778806095460224523050674269004975753516853998016992067156384275909925852502123153758630817493758908005317469398798388832645650246591327687075903720082820017968674995808729706561921596443629171392748889254559224272444374017120320857648871059741502437962922376241126948733580499450349060923643040320532855605043066201893217028235596432236499683671829336614774053932115577128361782247410058764186626878488040796594349278472680143049576899143913779056344555093019112647928344325799184574508143691633759411626113920290675901920030943709898747924736170195687109011045471206816698546239518672956875195567825420083996826949832389446226968529499493832932677500453166497943911911414108275768056210308556711390946164838839803728760586245397389629242638652332269961853975990162091308025778227823952546127954532926680187909226066081951514912199927775760947992406887718129785327920939397543036888457150821799166414337889598424794420427953959434067309207656098478989950352344423159048778751285418399565291353268327641146306977016245648256775236554444382543629570629552015470347300294001195400354711485827877867288756220946373857675746879079554672937480336005143348173127770113473264442134581984044889494892597002930874481702592428481434315792686320656431988675465926940910311039280080299058078899014399410177671562122916223551689180524029519365340975394126653902824698444949487059038964992226841926377982684601985304491995061849097228042083602110055608216797078027436448332846820112795469549619596914232842319649864432501365053250907505845895299637059086636850546186526323273014521991797042834328819311752884795627820815245721548567117746616804871239664605053332426776468152857273604279209963666728511982870359218745748560778699550391031660543726841934755531060936788913644897037011223612124315082801941981408031446069146222016179181675968066998712719340439629380277143800025237728213787729790746948952647542727304392543355143669868636448471772711691520323742764845110157089654694081927063068956054108047863813632906496340066487184319937851154206650983121901940389661333201930789055322327752148908055777757406886732275217900214858023547176292794354567517290850902916631607401665759505089170522175793291614907399932167947715584428583503806618554160940701396264234932451978785175742837736507773862537075759766071880729180662307487988500753498200732901075514265477994512459674195666869227052122528052735654649569883609494117508576403863546199463120800355480749687532030197060393196891536619292243947058156240248247402894486811427082524477156395346644373178614127657458506735147500897759362590607543868515960357027619344341620489104828725658174999089090375916247744815219543225813220405875241622027236918961385547672675575178262229929443483348854658942305256445743920898824599487783124264647309977643561002333402327810772874865529615218323543257658674281657566107783531736508944906129594977220103759756847666", + ) + testing.assert_equal( + String(a0 % b0), + "272040138577021178021044706878627130816474091376771983252791929838223150014334959316105356136388979170959729647902884294294345606100678437206362610407383416194345517670996076802170640040609712203348302642969554053195132536565973159348976974843419011530605490664692152858355397456755958023355658383320545818342811050413975202138234135197890721034248291764419366626042271016122333471002178571307130521440136363468836567572463489105912715202496297005015094067085489598652778234395879500876913907450219230556262964029843070723274016913395207059418170897212255309193420342080093892816483301802357811587100126101101954251416991011688593606456278574649469540531167473332136446902522480167875159082993532924577497721012083181694619470529913272049701614370629588153023334016192145318538313849855576618996855933406437163236570372748159429740812395733390846512838500436410136538524598215942259020412888564733637070790986339959683742395520773929145696943253316851654057897176644706273611535963958414752588555679705600761231593388717669370637535584634084871115525464971950366368749069046682820808455592930982636488912134311675227610313916727187426566353342665527289945204128229892421959585371823266834345358026272709178287491518429079425507143114", + ) + var a1 = BigInt( + "1449805890428142903712546586062258414708108780851398266539813922889260320260803096374911201536909955916116794147531774136687334496321934926737534907126743678052842468119791393062921713373043786148178051414431075957086561639421345150729479544283645744237333282565578095026987757233068767586426651132728625418547649757211171287592469499196791995709164617817085287216122750436911350196311243448371666126638734096918219253408644039204070549856694511431813216752836343059253130625703671003493615118105312242814559623540490656123750857700067247971686331002673820942776345009077199930646840668327239440994919096455144956996789893854645425913189879720150341968070064518423099723086862782026629489838848389222068825674506468315664556210100720461985440886601803392350179481932980012462061135888792552959903572845688062119880575455061169139765809942004801380156899576729937305608274232605603473956566300337513048635672916364166245177570150858089231111064232485407406723627394172433905433119231487476089242153755351437703784793646297960314315528185892969619277901073239922781570870890978896456273430140832597891602499700121818811224480802475633960711218783542126149132941643294500253591226877720071906362571332386784771746550094156288868123404018888475583139170073780858070987213260086786429277004650830415079668095059574773711426897393718640372758641557648367406599947020894185529187502857165218379249407332401889324582567044846335193091300044918538628556597961086242581271821766846968735007881677577039707791435276790059437669583242376735036517304452656066946610065853327615025157956779483901444606851619900823578485024881561805574844303303729983255740635402079680232504287300595803559286624922741551072701100145951076486330388377493770228571129666586008857255219683620072137972508256076409029371753642634390398425940719904364520268904404959213385862499113041409119966296182898611630189558598312674324090098055582472506698030032051991213103060897737153279924685811767620427100733002834242476125525902740513450479402539689267786936965284141338687749600874536124212532274091031578913514291727160088203200912994091671181538347586825048816138244833917188958443579348872665825570407889560039833242027234606145855252085958625633746993596223964420449087258235237294589529003322983800655162531732408547483207062826587479735056142330648346530751134227644349377709793649251699197872399340189275763364570765448178946434086125176769477938586440823304352393472145423880375071989868959642392952765754168574814561893757995793282058701368167989744126472483478284875070756140980954941716016367887784154823522282112052486626855578492275471009441000849947693359416677503563056825135262937682137572283268308612654574776764798743910455744412667310978032271163202714269789409855108571605423654958526685770389165307765318131752526022439194315968616226555839100593819662940551040366638420356645971144336420815530735289443315932978044141698266383076906279940674566797865396337717523792665534167400567152893442717453306346840831469980627353089507484110320931495553921218197677220612975160367361694910947938943122833616518997419796199172310497049959784867385344627192155011401756374274607945358739312171065051117823376678761065978152737630081252629984622828575586325260704333159284968695649703711438268739386240240318025708451057799621520914248776208907651238265661603782903212186835130525820725131534968004721260059372595433746676583147857586152290478865987310743401887711458946418758153389228792549634403504424498231767141685775985415324448423065391336197962168784226282935502420218033380492057389812036001710278884219894743068010905361479197865257261707476846781929939785524187962787686775387977827554983759739000943492372200640677713584650500282390640939613353853746428610693646406985635555581501849815156942734121809891001027024471363801365137488364779937153172149689204210370084469709700836261533741764709613675491230567708609959879895624192522589637524378165114068148477693222243648945331925306476544181963838295064933606848133088622207158318999184818808900741768646041424866142577284125941781794504313629719422982454073890658961984011479144315008445346198271137257528044080362536008440155855864988966328283060485707403251009569972321856251328005306034602216217849705850918613111801326689031857984160447479187504690255393289630169410883875172016761361087534414704895265127468524459820570468974501001269040697981267459474970906133897948163622227835573910091114457014289251215236821708942773486413850603779626284574057096637642163149903340335843793790119422745970189648491681061096873330961208723815064957468957559236692177137608620523344249634176863826602714510709793922896002848678125582803951828023146487301929489527301652536489751222131669907895299815569242376281273116105890567686343746146832866935611127672473448484496948872476650515067395580868698947468369133121138349417087443884667646221819203649398977740219729914312686002078956819267752419829307458962416203136913997018747942802530098051872219170176414637801342731066695014852120708552940547493680120334861427005196231219560369824503352419177123792838089684932915531381822749856842567152241059035757082673621414030079066460263620620230468027624072377466154149678799784601977110562667422755329783771358712315962578573305736170532165794781426027767535849868066500967996992095382590852123834108157222803486091023034817228859288256108458531692067040244046687497230269523328348064954901774962307306056976407912632597604257240866509411907198211244623784203057939172770279243796562439376231318744735032282828363518172366702752091198875629484883709699387878548959442092829228617583663942670199502890761518999670500208394669888232766368748125459031190503883693908763581845407492711596809125998158720887392539802703707536912787322141263183314275289563642643441303540099811107090222072354245974985481611494148281694312439949424170004658532215704385287162699716680293649631048123679238598835768192057992855816852641885293825534653641220062906096704079543157581837273218273376454744991540924387195835079437980874951257103566146056592795582863860593705107530679661890144763463253376934068471455568628292536405684691046768017868529049964359363036653158272813661509200023655540042945211859173604802372742521631421812779213101132610474134655967787620304946838139207839465401498797112960129391098577605830669725711075986607133712521709471404563662933223867726799389056902706980809440136668473308696491461129046973045512498360615744681339365575362551947317762906968014565552265789754228853642709616541036785995301290058355499597007775345732091077480279262296089996530269593988274490109744821073048964288689820674362878725528160476101034129324060558344734806839911997264976719714067470312723389769258708412551642201672113443413043839582543617000741328618738578586659049462536018631941333160294586362844410484988547423965254742618190051581929217116890322302411463431406883558027436770142745458223865270308094748472516091784438540017986780748048939690879126413292763201946091152563494864055854618486459406535979942069561390272716745416235833585145712009097121256829398799061981013203026528118971968986896147975881419154797949408329408806164736304310651841121672168376386864066170539277164630455171840367765567552638318837985359953142345579877695132393161389308792567266197252042406993015490513119913250300219072346659368939483899692385905909965750370388637016321749131537037979020428847651400895315406600365483755998147284897549491163271736655191714631731131431765814326101280502773001852583390374108110115928174756452168717697819231344420406881739533097439785257998861781071365562835812268494839125119156285836888202577148201254630754975336404937525592015393528174756804410116919470683101467806474517214732234327759427133356374292060013074801999255326155900930933855207325641168313370589400883708163008804037752786320383730727227630939224991943698025297239948774029392335467392328238015401458827789869478045412146882770809226367849218373595026945800211403857168055298100208941282308733158844725608081825126477785743111824173270714256609931233717034975000905858673116521709581519918557582778591164684213690904438762674419755371308250737327440778909191639397962306434330575850265336490901993458510267433372396473227589842020251090921344152908592900159443533465378566637001729182709681049880061521597292614880634098199259970835915031597661640970066002401476949579237617854558194375156629488342633653032240526289903421142096833484718012565730296009352097239129164376902914149207435059705840508368983805084313809124815363467984286329364754796193323501134540024270869399286350073743418423122412854579381410867889945054009681055480379348141575419542196588358898670397158815470834030454963470241726305705643967693682229445776771915663709551239535931333408250470822250704973349041071148376505355561516486745705949944487277507247779406676493006962095010157986079883135564801044649563344010756320237104856163584807393090944006584314189413335339923215427859490943172748854475175506127014565935840471911883818455162848271353845341597527520854660645837754509521706662784917358970454361477509760005375025690854158673704170074435196586069279792798764908866869414597450970141535237713315289805808677389100948935753256236219862881313088240188218981314964522537393070159404991884758548142572181292293169164369210764771672395517368836034672733153508826706831092352763916445988184807442880028567568836179664629293288416988449215835857582505048539976633944515188496626776817841555283138868873491156622888298076678113418614653626027501074891700497839392399313363290291496403881122177706141662329849506217305484246609327101663512008607645645078764430225116264154866740207767180264081754694253378466386254104382570140607475613539339048371598935046921216421045094286000915918540088987843537051356665843431534593407684843166345378117334414268321149066973595705226654304788445898188251361402918628734965402260411409734120595346886770945729975883701710807758316309043952928584768125018449115111278411725432509431756519935840886516096162721058638435120980313560359507835912324656985771616290474055093881274811153527056707619004460790987204886222610565458538524983779272562707605776816093322627280344792541101147126400883980940220399409343844605258906041132184465033721659844340788362662439203558743764338628057161538852900861618682413588033419049441034355037014117871479871115112980797739454390937880976436794036287727319790666681044939069100738736184488397592349369471268099417473140516384517808137505979832516735535946358049139066908395280739625391412447752406779753908374933481723294846703085580170641164202110672488758111938199335989727108857452543892714555721969376351950205568946169687204223889077003615329616859917392657400127607297129547251211703312548935359681130736806942419574542019042510210852828475280066320259035967206732202656666772579328247938092175544573637135637245718545200423233349005531822400984176856474711601641658086519061389522662495383951657718716924829327873528486882854276835586427933403380156573063014682246467932762507876661287728431173593623057637656923597317232777492096186574060406422936661670052778109794968021785388279726551958697539035107642765311747494194472275692215513518733338513126840981007984686910162188914542318264902088176011904478765207023244518411347294826912730631873145453831230772332736504408601875426382566298191306712380456844865623896941954705319924956072524490381558912504330156418263203017690939878002954245048457647415529443350691982372332927522228537267556550564077984073763960358400712968812497849913431861227242007943546035452450707463590175514981360506431488475747417530825146322477950035153100981449838598419669680293374430538103632233386955219050592717417597771257740577908992303966397137877049962771636401756291066049729939900783345994583421954744777663297723801323483758435240460817918250934796996541992173326406716441686001082806751846714488447730538402044671867861343653913327558939221585039211973582485358252256381871333160646858359579073140501504017103718279916081736248790545213010712848583010519269850621749088888166072882662469003422166181796118817315098241268404406887716984134229260336764664087794265537763906363760164980589898426147154053824713039990867886973298426637485309571553680287337933377140245805209860747031715599830125238903054805822374949955124564854133768662851756105290377931987101722895887032398055624993876352325660483248045506963379766661349308532487317577145060356376665478739953250492435404026454074775821102058103515671163242636345974243617003837310338449830303914352091910971852757958147429258354642305423106045545647692235250054702860114999007877354898978970383150154608413280779239685989716654883733629431615570565853102233427161467308899417387876868475414904928505794317885804270675309761498034628579176087210018983724950625905448181045557505190300250661647467056778246531569344167304576599268947011249747779966055956269695003153273036225756251643592476356472508866452557282524688012403431570566970090892963747811740833871948689500485550520752956477252712096406330170363930939397833720560982066219666115972326059658221250842482066541080190904616416788608926014782269236754595868627150979577994249835463938464461103736496208027159730463877865367498933557679077174270422843840645036202291187690687053714420846639901800522987344932651779927720012062748186852578146827153327005725550474276911956332957022479298073337372121968835247596878536275073353203023514309123217651911898466065388545181963448487686152503508050592813638879980879331105681873818312887156419927597620420927185930319677226179784267666467222059553470974117630318698385184990497746891342286982051510676733873101960518675415444690025070904407334303538448064724755417078406305047944692275976136091424988781054813938860903068261221581925151429666206970949160658881015291878582894282004682327791594801240078226975084235287246858038094538769997344234619015053086242337312054524809578019337199747894049010901005969863319314273217929121427241478539909368107643963758306334897849506961586177234741566404621444443733176697209356548965787699581838013006299473456782763658541746532076310604902868849181433899378848168825881862370778104411359983203276956802072135006764932508937925264989830700606957291820976778744010654506039525150091804801454564945626860946660004664612965005332261650300343535283413217061638173159257762448624480487403231412466674963524671500520041656035331302967861379142988972151673943714804442818690535159451022167820099515620528002890444487621778694016321710341759517096225587371048771281662744361434734819694305104499168880150262241208857469628301443207565638002277123863215203671408724880984684425416118575986349093044505504496654892852946036630247780621818901434047828347757616118367890908160274860177728420025483629129873873569137346807330258850852224226056579118465522066567664474455150030857095556437022214694878166147268939554350439007607272006916890635212680869324650182379202632807298121279691864300325410332937920057671537801592044069894411452153113408817683751379359147505139656553522235269636676472085911111547123530122331467842844103217252478338538166880189882502239291235911641657140920058371498499910836380041452080748915035550862511290562739408347216524092556475327614640209240502285352360537109317827602642454479545976678964595944264935216333889139668622762013020891319517578718634131639725518474756187364300325352717893668494170220431148821995293114092079911859141164100217059277261711687850960990288080687421256396593729226113906280971868152025713820464698822209933362790748300455953574955353207614152648280578227234962858568669108183647254961709068304837413803552867756161710490468742086783687161772037955199663017775254274156890729091410255297103613365066790479875737208562902162754211012482506154233960179790721980162579304337480768967209535952459541743481285068180006591077850250671276801829399767442782488512003627838466247813023347425282866622287306839852780313012039096870866628114643201433540033484674746644683558772193065279230735545412913794798722821797187207653361250757294062894408594480841828698124288163333863871697858862842879097318293753270807633913810388555936393025284522364694596569064618598248578013593585725630837331461139035482872417776570287579843859182831480371687351596154973881522480739078822726311306840284672350070225521513072001767437287030729248453014332337511932249500226893857151880946495058970511066724885804751326663460871268152912412144826796669700808556657241697482223284570602864983587183564896276523549163661680546097761296607210975254363669578021745527847406149794893678215577974819427112384784626791648454735579930986614019103627500211654305232193648961791149164452616720541849327642960291663132731345395765215606029644681708034037421858163043964569336308711742151974207234120102561273312048866251198129356884138632263160936228323028288195216408962168450535194321126639463218005928149466009831717579596992185622501342254920117081407266898256851985566470360178504313877247650388478450687125982133916456992635309631841296414165453404927048096254369459142511733474824893160834259557754366210236883028643286965439803561268576860070113790198304991895336219299674435845186824366392737712537045147804709069296760451941184138002847007732379524078944083947371516272387306299137979981673526603875557417777436921489830586329614677242428255818599636955214643015725833710027409105856245616022851740595448695879039254148999971363290784678668097036038074464821008428314777955513408968548269076328814824958231308608323567125510283208373422522534572893602020369315148314892836804927582079921422030573022114863709788081340309950693811668945949114562115524374898767697834608825744232284718247316500998839743940797660499180874314948514301056683955550411468319727484377642504931260237550778652304354000421652666322490215427677806447529980954275761697808683191700259519254049375182977376818732042283755803811445148310471665107021772245374769429264572045529619117832487798904706367238772174319250195487237658072578985308694639952915192583968535055375915423818586509358687936070088506030678243827709534803920420139935859172256723707682032080261646281921682954369917262143828531167163116374658697455327494087868391962166172714862559462333168583408007386107433433062081887325172475545013699064587000354644253736334270513786211673266988244769821316431878788637812576276594611842522059020342864113337249204071051124863529336045569517045123776118570568171274613219712288426150379281672277674794149556921147841873488808253873944610712300550300724683259212250296363931640300144575700545658625283930092678007653541005557768664502325093024674420175771780282758392973127422261072393823752529920556496778374520617664331828316129356336293246896713575870188392067050439273586829669339464053819704411508162820470515876726296980972241538884279258122191726980915779899350328356456157157811441797456096544807299219441518524681106671517737334354948964586806457504343943698979357198504742989428351505618100604790984036068730622232582091663873981110117327290067651157078581718407005366767575524727653983969472375564679889049555848161429238378598564083349648398669937584307842477992318363873226961581366862652146774374194402689579368964924109132350555220643975853936137980528632399076065041546937546210045436081274092887305388374440213424220190172456403174872824687451784303006587255555308933587304129439491923625815577923611617036922335323827473828062264416158833246714345355039054249348730620105146842099485753987634966618603479939142673216351434415102515102893087659809944316261360251167477320426324418238193806655350447381806808097573884332233970871404626786841693121944584033715187487734010561236354040036923504651615268104707162479162688011334468644709478804623" + ) + var b1 = BigInt( + "562744330380752408566143681456663452927380634729278213486891888881755877636840264420151404168645028558700208659100408669188554294598923379539849215409279937119605596518210134696270030223275232580876928511518144592744641917430857424275309835230988330991906194089519844724316066046953449208179815272972496785385665779415223233690872622454249723527232184225658403231599069295203151556879489801591073060908157281995199127075761864007446606030555071195630845518989685443915530131697877011013036682046665113506240304168566821568198137294557778606688979765441950831535217327484957588205889019854705993401134183629034929103327315860883277147965299282694043068458055120435271656078229966029989527451456426301395916218348613662800455950486730670479216955471627355409209128144333347368351694389568409979831196874435069491894914214195347244614204168603465431802063485129108866198834746549636722858730886483449930048638708089640030655360335655429660513411571268212574597391888157212114068956582499622306212414379241562656307124238188876302591501967042004038233141786072633783406283631218874799960012318205528637559493889065776818947453230063571514483050066603401325649748581874245348285089274694801254250453952124838127926320328709255524245612814000346206292155531050015554315592263836836366390315190917222904953703384302516997445083573770461938779484154854409144827977529493554665058321262710920442856584454646675797595603363804249420784012866179359907033370888323247961795930499206591122721158445761390799487673172527249790086113743651076062399120979053277830630354893416366310751497980198124003840238019080890534750297918571975273922508166801836250892264525131240303073413441338755563527568722878937431956584307259338437114859302904390833835308157589575500690317611754281230421828624041252095191673995563574588513774731901150663201500379987662722860484509634063587704331438302378338559191821029667534998604013828032434433000117131978370744590458808343738406143873900296594013215282527957850874840543568852040394145890250099526080256874796687805687328803022484290739559844515028248841361791433331308417537701698563749880430890622283432951046358574161529005044629216349611846697593909105061346001550874490701814463444804542279444875866888286765762570032856817499460360066413817618120593938590397614803646710836240619672941846179490106536279410109468058065035778071973699899685170790744527936652690841070033481210561640636292669291341495447892573197311550583285034327967087037452" + ) + testing.assert_equal( + String(a1 // b1), + "2576313633310539588391349835641172502151639436805101004169628866302234854255543302830306942743774682423182063457852237240259085656658379391098984826343475316514464531472785937865158962254507368443876515436553454173253153930456275753958847379794747310016409544198149793221479471022883103608223386278561081716886548753890550680126754860519778288817439778664753151288558255824097183693888196834234092768000610504360516596934307776398902432769361555667674710057448585644104127409231194800827093366687903709152253995000878251670512111296419607227037922159663823055584542136246690324838950176990442259021580681156892094894248474547307647228154964256922462591311012695166196196568530686039870290232524008821007331633433681280358988146388568700142008292132421600237790869612726400132877318472454662401137212271713566282468633456862582701451370685498353376153660817851661549728348748606046388479648049309122903046527104946626426326711908438736499328688189793215914914292827314236568018355093335653048880779939726897461689183549574005456180143556335403371204253032046063689805713194507158575298163863728270463073115346390778145258327946901163427229924451549138009218726150376548790185831505871850231983100029360369003628932207764899226178872719244381646049281138263944147090943110418487349750214773181236187015212168176654638626906532342653084505186580605116005487869919805094790465512549919542184508860195092349437351054132234968219268085517000237242233970225592583353045178351369625617773826366789490281784190611150402364301340316339756672415552291183221841981473848966996737159603467235580075846340897933087639930894968316674629663182613904020090381217217908766836809791387809660625365618336683132948794801163427891590798463373390561783884790596138403962979471909023428942791363835388828944254928963291563440006417293293174813798408688333449888963123562178972256523878585158251938128500287679968671528898560126433813682007414758818239452204982781421592831904183605651205266818680745793886577094060335011849923816640043638802633670534843289714758222943120126980574784427745375959177673651012493322484854862196862551402929278772526669174279124604975333445235108197371681956198137252283809352177686423447851587178791300877407411114692532684150470158605139918931555890205018225552286263848615068932026975949022506386966771057079176283032475774157183168228387737507656748048266659951206952925738796808622955186835131854881053038711067687325398287264642790738487279847034632485341867074012894115699490977565285235971830633499596979296135860598707254327246595298781571108467812182209032873246686620709113212424521418938994352445645689065925900876836688118363177623753404415840623807745726121262070271691625450872769590714506948137767103483930563938020721762931107947204525811096771249870135021153976511931347430814432291751932074006921295106434197727946079986741364715155407836630690898510954360329870869845550847891106240998892159505085722126991277569986576587919988947491985721815431629180181878877152605549719464827006323057367663360385696339374101308909375643497229940351875481920896294237218459670043721259519221111422239949077702629893578078335331993277394318995559051952487571280117724646365254337965889909364220713753597498224074203783119187645110947739048999384147184497428587826994504484984487349291990477527658108121306116209612227909124514536989137482946414880023454040447238285585905603206496719961870436463529858626924176239418389711892652537473197471834224320106983681932368304414038897746630588063340266503283062616075967017688385142585035036497745499677435945140731877371958772524776728751403135124335670567325793243857972802113776078677815457725948026490459037865563253221504928237799631017101883258842847310601414034830702541965061833599974787455251599529063509566146617529250499558662402253046658832719614750023734992220146920430273407074083175942682583452889250237478962575350045692603344297096238326159989054361672713879850885076537124367381790820860059359541494881527878338175189744856549979426930559244270089995653753917892460110501116171120436734744785697596853422109888802307966491198750700063342865969653401574290180341982254096628938052822342906076541985559766387020116898894949458105262132180593436007345709787386427593746617743964509594462201148013441685204181051034116159494326519454792279281964520789117103055262800941595553291874088126513922112497925776137592742425865295730986271355624015033068664107782699644379716599340698166839960650946955020062880503224535371072380308265282742071812795966140078264655256583018845465683934327828178037351486597968087174118988390165533495065016068332263998429020181011826567040567166869736381340893635396821301715841347685636476409673318398438311538932493596233907870315354908219527280528513063902010063588693155168458940594564935803778523308785303759417724073840472498549659375379549856368616874578466403945499868820434639707598853120493115524379144519527297124124071897969140368357185923226070697025367218410150396490572688587644898741745605486812481841203981306556560105147192295456770389712664034405916031852500978654666490659248942379324527840591180743600305355911691470115254028804704657559496677716580331188941753531960472091699836969307015386478587700379625468281975658658383261375014806305122868957048221925022130339235219732366920753174863219434740868776235970514588099093516559666208366637455769326869127650795323775391473241868563042686477982359068832891771447270599503354773336453971922923920206373078315295551120686507998490062406543102852665737692612131399293049234548174688251422138152695004736581258187699436701586787000141614493222855982501837517306966386964055104524232442680618827060782570396861906712287888764907200196263330098069362243865920284554715378490366241998771718181172959184405866360037206523616334635549098295403531588142075089585960724779368421500374723327898217494625957339180576407766828899010092143421450945928196204492720563273342868154516492468021478394275733985859165117475284831074108630761858187954823415059632860500519664113002943659697435503732073108954702474265338126635370594591051273611016815159344299884623364717675077952549667120657378425060706545533320741275753351199551287584922211292712731846478439548228898299569833851063603832418174609912846672545374667459393899984969521046274560415021905483819833293515916113814728082143766439039268836760061901617824879283337274635693738205020060559319654120995594614023343067383065599050615220150850039214464159538767539825609466203628621527302374228893951259838533603301798127844526135757927272988669444997694140461962831755727982550772836452913862906716023307062264818653503054523914367984187372495194322314193381497906130677130160296299150812779274083891889005365160786968104618981853339208426954054709662908006940332414178644967682075487741429832039857172156228432433231572104880032162723914373061306613413538912532199179914558131824362671311127863669316326309326991136475670947523660844021191699895838280081651610475324847318792249445546233316348880452363559399438360396918120557335895291578566175187097230514620530045030321589327114764790075240164653898838040235644257578504405392234647338013644421025790992561122148933234680819616395621045312733140930011486443285673780599087852404710571625969655598186220428896386441110057903961419777602023507146043220944846141911014868339833790531549613004280010585529481496408896983742131218883699492042225874055209361645395395760297724061399120664989268042031569615549052839584203588177431003694332692556127751659999772299810047000024502422656701507088145080880122131402450943498415026822647430328916714141452884895767300966995499339243636644865055140212584094227959024082276226107827072303033740257183412581643931887374475932152862309832589811149559701271117673406175356703104725439818295302626696873605877748522232189734182611365338417408308932588232433612534898329365451419801818823033616151729068576663727598200982826461860880444264975299685265405047045005136244493212720702292542404435896909503100630548658764179692573248483498672548956644550034024224323754732925914387468665090476185395352703239073473847868395485256166685319516004497346401761305760731732494264184378378007904183518379409380196942881348108937119712743628773443782221933582513290680647663433605940280197187468988304772251369142392689242896563682014620573926367731958144768011786449336716911908218094225969405389236916610677008013771570143823854282116939242454982129038762951266009108907560968679463665914812020711160864625891871511465919895313883877920136208385415037717027482690258569389839520678028980430058950090103286292423077690897544951822464951278612457692491288684553093616646911765146431699668713389268541894815423413080310366652894794979949292493860473547372558427137907378074473873531588108807713615060069323935129326374293927914092708888426341981010537740843992299258527640386685304949036362124350214460714547285986665542496910101992302108059730029546257673116495565891538695945191997861546241576900840888869910122667285345720684685476252573401040063728245624543768062238785648095145041382048919681319875113328316542011922930300959885461760451286510572365506979469244128089583803844664329952714027388807927446941352180174953719198860200130206259915410499228485742375439979938145563652616033830195753696478098116151564319185920200791321724107922223793518893637412494619740690914713115345505079853173143914732103268672907004673355271558509599635177932498546221443616474919816378440875700171714946425686119700916264447697125853283062877089581043515222664584883628677015522411150142684301326217092559835138839596273281803213808118969775848605651236606863172215562387257868910840351064189338242640036158018625707653758933093894150464086632012853808863139842197073721930441607995106094288028829129430574275183148921187058884848797583899800840391827618974969100684221149473794616272477177164765816500150932768410020966629707039162326870618738128626121644662189000077254622173331008416828646073436924292729093063276668845793331456276525331035906639874205603015960770986683703648408591665031124483425532177799552869780562808746230341321331264510803291108785466679213527723933803817540284143248860325488404304411945984137100922998344945391567653678828979205766789431001691313787287627587952948047968522797697451485775873213973026356298527477226866537783121098881226671825468201289582148970019656262800122161110576599008584656995449365323703872320272546185613307362213663821916653001029043253517330069870601196214768974461139734632676418387160319165433754939990135184028699932146224849545449238390884424450283792300499701524567771403160060009810336401594068603337006079970237322353433096680548988335497432969202633423015569929046543036059013343717377327129564071581998258202996640176767332595226106232429732462788253367401073947077954350376547635560406232565107166507794708929988448688573286760135583642253245527092389777472417933754555949019649689403413253398336562949809953799071461901755063695693902970637025246579727602160384423189764279711564741691335027885533075321827066877255544522582249657718816945034490167748100885650091430722767614619537272445365928889429464665285194627147777302523665347762873226750815351571231524264797148918055318633867853747539644101157308078102623109514952403890390276444862570407447787004089537056240517455411002846239274207813314980434881520815395732633538310892074978722957310173995980589015473331822557550412961670478541839918611838928065488976509133101348130184551241510656000894606287723825703016295861182221891351085281463712511863303171098781960643408495479010088834832054649166103049332321621800011470074704454681562119498430033462917966966938877714483119753762572780183400777126179578263962691538315031092027908726438858320058302857668062098392180801371405620036048600329643630274157082458082138181916842294124302849573626120332622452677492377649448198031190794304458331809432501184581019959061175233995946085102888038183514723799091086217253523707074534731806347390995051019573914627781101519102854118957616429152879201902873759393051545609992223923067484975949978901434659300635239121074193586492681332122499801738948346055403022445381786537381117757529799613242553389641410811331878777654001699299125146404889387138683130707303783623646972409926233861085937904467518412807328547130973848029792795523859144846182550178263553110086548153126737077196106782748253671175073750866609469301993898152743761639555628267538133855800755580111817392048185159401133781906208207018892709467952272044865665452886708090407100709257952186181248415421526710829080733455790114918089921762430356984641641580555514145959899993365828587839981353252422841323644982100139000568123094494278839894476917531431872364470218627659655644326958591944540712281388948803269934348359554259632106926702020652563105345584918111514033859391579949294455761441387121602385494634473015812154041122478447036718692307743566596143956471382373706446112757290796532396182389143948942888296991252901098977921852567263122327357157546263548312723550610633968983078452967219730267130353144674426658912058351013864701824170293613763886309536597721959843367785035943522561499777029921534862778680096849633740544384542987154812046017014042473216737942287589094605204821311014992248684127225448497844607308035649681068072385091678966791149600183289419852302935396823676349308179671757457404382246742305737115711873276802837127220495023180733781139523407823360615688547783192764088029517488449911181756333741088391563683365740570196144692697325257107315771220706904449690216321236849718044627495780690459074443089906581857111177084181200470012842543494322060504328435062519447133813360343348280490665537976692875008570331351538332685452540355692822146545698750658087453550802772793463983682735839382241059477704574177744457270541757559968699968732395023409473498837902225820206395451108525005919444587161086446650902459714736330335338845654924903513477846440657228623386319689249860588109858414004574559437651137294526580702963149612683732361450404286893286492495977594267693791528724797385412393663668370057906600073890006241351095071702790986613818198036526161525017486425472806200776260463049319843187048298413983379953094854018531666239931278089034549414101935275822394985473847054175520085323048104885114842831810196809193316131501020642988578199483779039595665680698210609837354331126630499636499087522246806267476246556237726721160441198237274969457427886670118024741832057669584821929449374325080858952115760209801512757908749803377553853140411651322937646987227787516250611171412397139257973444748438173854159232418232844011344331945222211854651509406255755009747273247058840723079763032628020269777361006503722876162158069669780940474056844153073760778607231796753439096662223480945948841095630046495071657558559999773675629131795224929982197850523059553165144837844525157381786549385954883344451700773023865824596946868216455924412055683840670919781412383942370049430354150926908822013638787650640397851251121690476956256493425981202193425016940965713887438794179530552913062258720229448003472992253204055193073798501061308637338475321156388940071295736481051295995612306265809147282067556893583213132652217384150139588469340461602120873250151136698398336433619003546407779947848573726472541874485500761581003352555693747458486575098040626576662877620587400734013340797324625997650658916818720850987666137344808098482629010262754653347936927008075629685132770407343793805541815186799739344254777878974040820669690365310459412401733753845495154013964748498875330938361181141230679659957459554825196141402430919705655462328528669176306951608315124265622266279375393000931867550047760622596641842737067490718784814597754211840834476569380523201149490695413088836108087628866758306061483410003199343889536389053077130580665748477043692753613392231888166717693084946780770832639324453689839178000007564958003906424756900347821279924040381375932193324805920399347237020758607301933016306665406724290594264650743633378155502256390025262355405259072093937395897053002536622846460033905823197227401966194774611942264283137258822873181468199457311286862350963983750259607386583706476207742763000986927986982732980567264898095921428273490160599061634460245149964447200956366849987789400823570405331021703196891909959018314331395483868582644719100161402616714725101176730674854645684837883270793750853484051571114681018790316811191219113227476050620413160693208551268446407690750936220866416316332573311882870563178505864219572028029088709733220952804376698556979669315756502441075643010639383181882100493182436811693700509108735137428807808162531230700182314112982318788071760717396266206165550160193378733971034276929414410338479704818939731089272176737890192118124493391451593263181363135004107476811860539696845451683411326720811716919818932262985801837895184200170578244348613039922366193140305365753495676917755657266035699086231787608312293153640103740593552102741316389568307762412248373272668832220369705735288252292303852495338033596305948030829421909921980027582684199871590810986884959270443920659675720954326025193299906607388170983354182308982572259705266301330899488995951997623336052855271149786709742700790116533521838824093730072278716447481460679116865786048723793413462022605718926076537", + ) + testing.assert_equal( + String(a1 % b1), + "193849529178546485079130882642231788259482983574955470628530650524062211815334740449481657217070506974056980752468282432651478333572572510217332481277393282736942636943622715926695340710236600159922956063870209744220702809874324461986840329649555434865820931023783180544647769895332122804783237459398978866740804588047185144917053067627985106640213614471184732356257214829636258016627210217696318468237030493708752283470739504021036124717580152349983511289426511142447956999527602869003668540099028829755271878540939843632301387149570168485856647891692013632446896979402672567137398761442043030768183814069196085416982171808222246784934569461324777405555956496342504092482870260292216392535466381612349498919276445145155663933493512188797668895776718645045054406329610389371990277774806344691102480268687342189155853380001570780220656481264615069871703849222654383630027600333586218437890161714847077266476693145521291442297563488630889641605793682879263948037676952589152470707094194702946322365108164392620753264309575962265874767043896620045774124518539758676506528005908093035555458356772827043192240827941666175048370188962234889313067553235605061500833233427089230150379566167248442883367837551947394386133007721445274517035246672848458175098260000686442175949754092040074483939891352555541590131079139410361514271813250234103435541999240613953520685456301022348794964460950896091276472454070985611784394028859814520266622768892682902393492049918126543481129996975438133391148258037558798336383664408384134855086197644847790901469458115147251900701577298145014092131261751118553082234893848449170870750123086415492239028547151217287331269425117986423492254833967972169479566582993583612715428720377059640656595439014663136829166504969367894118165193327471269909866513905697021184888376578091050448654048215770750061226323251145051324328209608427211106906062265341223759454376383415288454101676456888419500674479224700758820850385918271576131219019686171784233476412984216455426954754716586774271019519158402204789415862007653658965913555457897576517947797544343458024441298013572048021729711489513423976967178289769566248456243926153080627443802662424462092900580072299469471146049059796460094027491643929770973337254509526911705792848631079402542217444412766227147131374935012339022416282088336486447730697547230164081851323257966802210014669645883601424906898914915749468110992989678887746137964304854285426827478336500753179283019294875290491080552341340899", + ) + + +def test_divide_bz_near_equal_operands() raises: + """Divisor nearly as large as the dividend, so the quotient is small.""" + var a0 = BigInt( + "620006763931340600004741153468147850942483186090974457759624782976368306557221639941133811689926912462811462510937194879093660627733884189413903238288153570556095372363535793361017632139336595372188446069284187508538368877617683014707509719437524527772546541947567047773369779539356955968868164850225811474817952828128013785497183574813982759115762925785458003401392709853741028607064598182257159646481722618424779811203475234502158561514080550447368622374233665169099251902924016856195759617756674439824918397914087708726669609203311800391799522574646212870348689334973614881139475057032873369814139523065128159303119388036431168550843989482785407532939339567242198096952196818774525460369409060508200862708470798464590284369277666670582861109601649525064152471836346563620917436280031431702863899268426014442027656623522740644845699895422138679412726432333141206473959923669675635758608646204451149938968598722746300378727175850243090570905692970406866228712129088801577376551498821217520462816964404632918302645776837682529549821823260396160803701558387342128439172991631376276369148136309890150521836544446061278368349972624339028448421715978401471782340373578232744363000593475750491102102004235248710381488972729084375035041023" + ) + var b0 = BigInt( + "11831500472159513027164075958586676383526985298944539479819904482260475249561161321175089457127004636752140164279752285117618735693250075860647519080160171136787727979248804566928162661491531819787972289908736449539314943097762589272519726900165404877249273631603385628300128717966597852560424419163575690643661922156205074346924289302749729977078096122667644143442954012040868560879529500116712636214251587589302975562337789913693256507462754747396008330574016506165009405369807916020102241642039254896755092874956250713568941781286250308026367400815848006193037897515146659165838828525232181105898075439382355912729905196413929922730411126728024909949981334045174093123241121378277220944792981130034964893034231666450221871501319373731220595171649242153247312079233900577322708343434962870983360325793940988685172940758144458894253877565531454524854253931246127301207274489734947992756578481599723400211240851485327843618316531573629471053548064497243553703154992358580291288873356290987363950805350799591985709978146631026258323002835852764451505957775714323252016013145543400782323794741285038797601524455556551211873069677002293983352526172140257498511756667986757877210839985271666955502811325441679245013455333203411616678122" + ) + testing.assert_equal(String(a0 // b0), "52") + testing.assert_equal( + String(a0 % b0), + "4768739379045922592209203621640678999079950545858404808989749898823593580041251240029159919322671351700173968390076052977486371684880244660232246119824671443133517442597955880753173741776940743213886994029892132493991836534028372536483920628923474155584313104190995101763086205093867635726095053719875561347532876005349919457120531070996800307701927406740507942359101227615863441329064176188102563340640063781025081961910158990109223126017303582776189184384806848518762823694005223150443052370633185193653568416362671621084636576426784374428417732222116548310718664185988604515855973720799952307439600217245651841164317822906812568862610892928112215540310196893145254543658507104109971240174041746382688270690751809178747051209059236559390160675888933095292243716183733600136602421413362411729162327141083030398663704099228782344498262014503044120305227908342586811181650203458340135266565161265533127984074445509252510574716208414358076121193616550201436148069486155402229530084294086177537375086163054135045726913212869164117025675796052409325391754050197319334340308063119435688310809763068133046557272757120615350950349420219741314090355027108081859729026842921334748036914241623809415955815312281389640789295402506970967778679", + ) + var a1 = BigInt( + "581221056626424800367054665411628321353781093137136868892293009550792994589071188215477826160872535564591171856283312336263578366861640569456903666127132058764455929712620992742859310642515909256461544073137327432733369095683035950800782351676044686433235182248108246563950197167506584856557619796629702741221557385450269069225108280837638496961395802545479809691940613544230206825744954904906039894311175022037884001397431136117638068829601420530177929057906324075151480807481267775649241090842150712574315166686044395336272919270259630632578431262117184324876340189994623025998188741613244439050573027807761317023749300111440831658300006935030783480560234918807941956850357455622785164540857013248429449507086128277625181341052910766441797908618075993883211903839777083221425986379826412227532623273521285479360014579837707420058490987570442382326066899684832577178805431755850581332984882798275713157707417527206407944359004141978916639734151950509845949507277953848757405672742610069598237154467133877045567519092862692156008662711840289006878019577047101273396542509138821627921441766964869813831542201047640090643695177027169429488505370545057458668958119105707548044437262442723070593785831039989496071209204300407714026640920753685135244142773699156183073442567932501602186010501170509327277711062359287299159291404052788795611257135035294138359107466902047520347519519063777430225154828950168219844115618396377536239449344810643558720654491127325359440979726063558492672165790461290841342375813817886800918615522785322997486592175780260275836986653254089006511996709272779921365862501233838636145784554628853258390236527340733892251523496290917770635974334870979584934627698393407251084272578024676442684183738555682387169975350320672693103205970191111194582388552281908862758213555198219088275903949850194639259742611153411840546422006220993613419744059022876990772271805089003610171630898917265928604231263996050249261589089785985267434904881020621116944760075433540721357154684670733324306050611415872342922179417331725787640791475932021194468755140934238103288036605675460482183757404346555407012221175808151991303168651042447599741023467428141067308263116334213243558682858809894822219581785322648174515484161518588326979845687269116708226399107325663756044650900817210295109498566001584752343940521100666285674721059523765185783326169606316532009530403559263757073408188134836377674386570530822568727766507497851419780782910448270585370028877300808583" + ) + var b1 = BigInt( + "240927074834925959618715252666134075119463270352328655613935413112514102062051175240784618522247229448949875488559671603298095480531849566644929018294558061197466375506253836148141743183173100253130117230009629578177624567938202421872010747258980459371530001695830916910775155500750485104917258874012828485089003881613570391768292181432935764210201014631200683140457299015954951351330888541576559503322005019399737103201046105002744032441581137144294622064865883395922639977490356742776729311296011555395951336914628296058418075354860143054457100054405958514334311120939145305563991172257397644642164759903035552228695618717107807767791385145414896388401069818776194358342288418674223510455455180266981965322095167843139552336482241657826700048719993565719197334965071019918778462982772447889595114952195481984142696486506094292143030399150914285387941631834541242978741769943294195759896166643435831414903973571038204013496103523787415093218772688024429951192854648202106394715730012326193675221112035707516927274887751800618447083414365095452684483127007417723844839294039183658947404989308093299835189280719584063231994882352685089055061150838868477358281656031921990976292835344067039332593983308243874445889280484435501358074643313331502479430278012731101494817881273064934619801253719516682978731630767591830778072950244874038078751747239634824298052157138434753497139383441226361665335217476521396652059076886882007957356374770238659359253575392106233379545814996666791737938790247575382931057851756011236141730336955382296220161923569992073575670628108879328523476762317903486487810705448920675063768578011137024662279955328396983717627318988996554570590689517683167803304294163217640970577646486884257599510240580790408817761889916614085708031985325203335502517772916149060814954531387605513533683333731397964561178993666137909581750934974617648092997445250953228673924889893885249277010052702415855007406744856595162648853491100542229422996033980221997594250362929798788196610422984154886214176887881838435378645643047276249653517538683235676155169101273764031801183330707603621334857196376207579087239452817495067794062830631012752048774800204745949269849013286887751285980272191294187495351322407497908266528200265350155451091737292869965770990009782998722549442298286656102175677089321464292647741331754073797569198449201224062572380012258184994097844450898624121466223427075339395808093733898542286419191717574267347245188468691374202961156717413438162" + ) + testing.assert_equal(String(a1 // b1), "2") + testing.assert_equal( + String(a1 % b1), + "99366906956572881129624160079360171114854552432479557664422183325764790464968837733908589116378076666691420879163969129667387405797941436167045629538015936369523178700113320446575824276169708750201309613118068276378119959806631107056760857158083767690175178856446412742399886166005614646723102048604045771043549622223128285688523917971766968540993773283078443411026015512320304123083177821752920887667164983238409794995338926112150003946439146241588684928174557283306200852500554290095782468250127601782412492856787803219436768560539344523664231153305267296207717948116332414870206397098449149766243508001690212566358062677225216122717236644200990703758095281255553240165780618274338143629946652714465518862895792591346076668088427450788397811178088862444817233909635043383869060414281516448342393369130321511074621606825518835772430189268613811550183636015750091221321891869262189813192549511404050327899470385129999917366797094404086453296606574460986047121568657444544616241282585417210886712243062462011712969317359090919114495883110098101509053323032265825706863921060454310026631788348683214161163639608471964179705412321799251378383068867320503952394807041863566091851591754588991928597864423501747179430643331536711310491634127022130285282217673693980083806805386371732946407993731475961320247800824103637603145503563040719453753640556024489763003152625178013353240752181324706894484393997125426539997464622613520324736595270166240002147340343112892681888096070224909196288209966140075480260110305864328635154848874558405046268328640276128685645397036330349465043184636972948390241090335997286018247398606579209065676616683939924816268858312924661494792955835613249328019110066971969143117285050907927485163257394101569534451570487444521687141999540704523577353006449610741128304492423008061208537282387398710137384623821136021382920136271758317233749168520970533424422025301233111617610793512434218589417774282859923963882107584900808588912813060177121756259349573943144963933838702423551877696835652195472164888131237173288333756398565549842158416938386710039685669944260253239514043011594140248837742270173161855715042989780422095643473867018649168768565089760437740986722314427306447228879140507652357982427760987888016077662212683376776684419087759666310945766304243898090758144387358656167048457857592518690536324161121317060638566145089946543813841501762015514140961333984157586058199102733737995889383072349316725290405973065522179447715442473932259", + ) + + +def test_divide_bz_negative_operands() raises: + """Floor division and modulo signs on the BZ path (Python semantics).""" + var a0 = BigInt( + "-741075808022663358930199636882637320216877252638771057326325625954070768430833826293723094632598356803332512748984425458356054167529020302572281007500447236586716870329955880853169322441446725360734566278844326305934304117670538151575546215173462939328988730042475822428677813194587991073974518211581213651330154421313690213708992115803980162424770007258445902976822663474559061151197517560419795931452168498660557227107707288422547024700291855007818715273494965290370628709467400317480068594711213377127583034066140725487715591903297493721048082251696017342389069297480314078868753175932292655809040541089967002522723132675086318896734576165383341729357303715228521568634800005596990892204120827729563468537226583245761688828579411998054431709047967563601665436433589009588735068657725856524788997678699094859299933363623661279845573090969243060881324550009769451905947655712966229872369195530920394582658212890555225988497668377808038194328895738704211682323775284597593475849649807769826051958934708104484134633019690413978106517324970977524840475563639937150778111414256517965078854675564576429941206865191557986235111168162365263061452082981251969555083497989742078319789657593160243582525181568132851615039670177454465542805180470095236067691385602906729259379509857268386579625570627675450992113018532339407663470760556237716628875047138066848690751205818115274354517414396316304422415506353438105608586117761463357449573842253929233236920631542701928804126304720942454751228530797284640799559121585281166604470967548975878420406463345090648844243318369707678224500483851331212481894814336016897975820398340375011725821532847879401582192625796496090203646543507423854775177435396424880148115727497769524731490746133348009084126508081363536165412396649172636857774169849916113979256054392394139529642202386203078441791932685617817240923367910053682888491222169036481156196223011235023019107024428779623699322545362729729858793452722972723535600923178205012614815365439497046026201831295834685851029323429771929764061597309003402841884797222496241963119903174582298210598243858378549189784241997700043838901382675455865038969313889805098684863374823165099556555228280340509046813693569807678313772374323206067331233944200017973486728380090864338814241575248084513417649515093591625731153040724509713094926989960435035322396102396839992343362184972463904101215286366442088790117636046924985354069022278779688391387671895301807604287389188986404784119317961763134" + ) + var b0 = BigInt( + "686622198980150488656237608440458699927154827466035022269849550787207491633264026063578492885910856129260341146101673250869828288741867015194570431612795604672234356910443021837917551561601265528869623329054243590765974136271363126456039372527957436070280755716445954521788654665843591678282122772996345749781861519362162912017129507188145662234698583990097463493561805712226476952894318062220813156037520908680441647015472144383667827542141879477756209721002474354977546516690706708293037530515582066151437768489105670860319785344963655473062799147883956307808299314819789760992850109284991530064377530963501240995291595557441416619101861284939785139084794606762489672713973488392826058639392414813735732062190318698628870559661509667427085968736566437810002368511387903798003917877056413549862354492975959328005034689598332950726106222702842199521044396467953480826870853768520772767351626392387090494" + ) + testing.assert_equal( + String(a0 // b0), + "-1079306508183675934001935886774383322305809614051223858353632660718449112860019456882683885149304859682909944020953670996300747885437402638000211037467091404573899538426987590136431251887836430388953350019039083001596142221895671699003105385785937667845002802957152194362390301239091035003331693239273092500010265094363845372491857471652240369668812730173919710770852370089176902174487879145869891736661704247105535331424929998750988074344521863686439455567840225465017882258513770634024370984630313629840376095340450617356009845562562331189730138888749638752516172725301285345188992841539046705247787624042876363501617459489766161161488641532086122469531932767811408145305870845253889583589999665789035674337914621608478689217599413304211452051367485965670587192351331386814460117836070402979664233809474661347696485531515994004960654522092370556998285462770338347804090473558507185922530474722945113456246558697295003675081023130031145523718800280695958137733951069892649617519489955532652836979462780892006788050367202139208585699281668288751251143699718420262840626723756407715618978753230428595242740129115164209639234097209928927516324910721242989059473291359091029520001608856464336329786138394758138138188592973191845203740654047890124337630332199681731186769027189910147557391859828509633040129273671142830856978725227104228683158630723448271349062957615431330923226900032032602755770330667640511779865597689026021243035298579606488502832878742735330730291712740109553287827130859171676784632262864603055023278352129659608724231445406428488524082059635471", + ) + testing.assert_equal( + String(a0 % b0), + "464534173202586411317818998946150981561973365557174052078493669813144534757138967319802684016118978285716249363266792465113281997053917708785980091841794270529532817428463788244099584377145550901325237232093616905104551765986086218330359601156276911351120487786375036525858697815493136698277293271556116531650105919872529270714021676430699637430189714868570253565481201130875489777870281666957017541857129191751963256246068560900641655999256298230872954677692145658121477216923655987614043210478745747120715909405169372776132612042322583665055103889853803154514679744849318702609007836171021378256018364345559994847145755204756578941504206472239596730599616500995175287812545651581171781121973696228361802776932880988627667134755914846875611980193555075524758518145031533855836616619103729195096219543106647732293063231981758389785629598497159837131725661961192722419865847206869171861974192145967549540", + ) + var a1 = BigInt( + "829648104436993026095800647144301523348612129638841740866144594953938800502961266360263310223006564612508435527115197336067301769748745209896571776345807813593104575513585817867193407654589075943371747296843844253468158888898832393760750507901680683898767946272366807595257526897787119929438951541324203145376995621162647217413897222460110678411378965189601396779407808272193290105162493973855680598465782626688315382365697096604971648635353314305201803012883085861245100711509006180162639395288797781946519773408077874489260406392057888795723837769084705617487987648615786279645859578481286384506541540380287014007628676815128596388692693776474858936701059327996768425753821227494201561118690093708916829565910924471705769223617998549756230001757098899326401114207818980159553595551228307426037247676004775499390818322312408582279587705291352373703984025739694287592543245617294005023068252264347698610866723856061271913423379667488891037320715612103140474584227140235608559605584526987401274798096657017540136165701744804994695564951956865959291738792313268968968666663161565863155793669467160695025886085152103900793838476815850343677555210195365674005204369628252273278262643232213571836450319816727004166473436981359218489556616144906381367303797527007764143935762734794216543941067405138274195200317872448233051931139017496392782016458028831942735396078513756306978998123499408251475508241545318877275353364404974566209869016374203271885442287943393953491388535076712010423695451503514535053805069481867952260195819030626123398944876649198096162875704213552588628028394379845632822545411924287052582635448049368280827668001457481649642406200929763332618020590903716684196422728993151060093055598586280729241686343689068744030676452111426566728291725301591168358634770126556714241043805343334386582578800898447694704243819510272875223610131640738122342282589107599133491956496734756020075025096062650795397976965377383088968777778980486426481864838288474513139139356220613564576717341631598438784686135273991862183548278303442740293423625036750194416780364003990529024863492108479376946576330159713598143134752455627816061122255987956803008991620522189761110381004987214989287107767756555653086641726445624076212765094445913314125112458532083331613488321274726603611260739460310825031995326456261440814415606938143682348300829689620098928613347007310959346203254974933470484279456286886719985765817691258700583540015939434744507927124001567710424645745957108664" + ) + var b1 = BigInt( + "-1144935478220733539347528532724844470975992272194821215675548244959912079020390687023967253808341416949990816511333384054010371799933714844331005231267674173459737611433934328049115868580118129144384021198831749401415731654710715310179549310347976422944272414351880711537246538045919491907157318686030933933776518033996742754779147983400139425659311493179030231342320050530275007369487272097963323461917781051630039515722889702129556650725531397150527538840355045120535234588459565973501709245086500850273482880207472939189310520377329571312918460314576069422997848619448728328650466045342209330903931538439631380239228719318287714990357153572016877234281889772795312638945581850353843437058414816886299486155809291668918757863227225648825088591647115683623072423879570796067428889678817602025945196666214796259963897082458254015629319810080689814163746192827460728488446458488301829327045718823399201319" + ) + testing.assert_equal( + String(a1 // b1), + "-724624330557292882590328742119150312509955172648834558901621250464830944434339992198602672086412707749892777752023080235050202552436346846962518378286041621877235690330286806699789103688828626818669611725726243966677054172733860776340548602860144940411346889071104683459999970207169918405178575665668158678876480811226370406978734926166174759828634948327178772317669808502437197179813498167864377945274694782899524487987403060087909169651125149636438975966952890524412656877758593655795474208398250096043931119888843846498969725576190584467290062152750208306221597127321520455732819344991157786217151512344482725658645373340154223127470744566680451610544108370827243506552595829470198440502522673548429841491610080254307290408433673184818454079927236168589905574760980820199259049451446006184060041045009854052664475309827211327850688544360839007955906998250243985653332940686280930263150697042238495648238770622649334945211414841377829838301876131881428091555559893054314719469860702520300420154215292945998846454289741224737310046254258906024686946790541425968862682078697006179361743332444145819162811002591545764652552786274164760934873191168109527325503548334236869633692181996567289023491477005776030598664956455127372635439252091647131304371631744580621063702695276886594527505820870047309176185227511080352011193442295983113682436477572491108448890355486201764916951647294140955201083246597494486119750533108536251040849975813254594749896675759089876731522357640723008633778126620636643642408707797669454446698141480769315227973917520867894706485733360405", + ) + testing.assert_equal( + String(a1 % b1), + "-312831933681381232260431026513613699779051186450168456961671216228395687428392452439423911232538798518360847351656557938533720461924921796415622939869379389830786056299107479377734387496565760962559732704292056041458171066231436800948940551380446544246777785802602237906044356757048232828488566847399540153754481936053851900184597325727744526109070424239491696642469671535483508566274875544542792247529442921627901026804500950865336292191027743612463429943398058028008287668757008328451278119593098021862623798800454501042677240173480330113975044406048337981863045849024929915098841221446971695733622102920833824190447142554667351050335239227307235918723351454051333847862973839813028131861387043254769337302075329010486648248182319596698809350030325822379798245990064908870443898200076005154200763295968926390727909340641980496603734172466742327779780317618172665205650532184619816836349369725021265531", + ) + var a2 = BigInt( + "-665433083704619477268645919545482259333702450588667452492216702992848740840217283282804114722031008938471341957765836626630689282862799109649927268432017206223723661770597939077591847799735404576349250751628096275539867576236458761136143375378192351102031747855964000401528030097148802346396391402318300512155414097926814152021912289498338048207799607746904089165973496745921090430726121537384721908346249737556248323942788097904003166138671908448032821700148813766583677485627867486369876071611474193588254846647882461960842225670446103048929596224607300949064693089641927496603755539398810164843393991793331563193362420083570411841110934320075847599333251754695634158044144716222077883585911750327246580314112451021657287537608941061342108642058516747539575329799678775417296113201588065947365062962400506683386082667209443798840551487989500434157857918241486250908234720028376164103207293062548503066650924193293162527656933283626462981801854693343961564682577325239310680688183439792132352463676309214659340080012694772816085743575364443509103847049779254643125993672762860799317373383708106222763576135663363346784282242456077927458570860922594266343390649917125076832791937726880644584788910293845733087752635090528318133659142651345078624127279657472741568896772943106979958453894026992866415014701299883874246813252292468893666875512114412526610701393649402644132279897754408745867889476012275021270656826769151299175447662606492193568047503780556609001389820354704584442412540335532835852095045967374553765627316889924146601254614440017527481813893040489101444776890868968073793328330246971009427831031117112244326594567943336228863963199515346410381550357902471476470825544683485281420888634554142064953962980311825527654889514231644018070805810916839065416753071598629870733797433200032535621956598789402323485502549360222038979767937520405907017410915125556719964241241641412954213131627731768311576399758491031217872167130698282774534122411936843718219359607689233601357240440954646041842250472272861114928734078533899440395094494900637782006982010482406827238046762932341990805311125288389732365610413834101055562566661764423249979632026446501165018892775592029243419342272043039150289824568487372088063354044572855443575366035408010911896799144018475730673939036521861041685439408386504543672777572824141111443529329340621118288357753700367437131110564098326196148084323103694865880748025672013436943236682904145252169184186848527470403391857564833615" + ) + var b2 = BigInt( + "-863973392404673483918859544244039961595896336123218661785707252745946285291387477120973520663793565091534913495858150974989965127256103321573844553437551946972120215341749891836013712211617065895407637797739207106411836769491713002054064819635318180060486803684421252890726138798318480971911623580209425370833565158715517910010554291887679894568934007929574976175030841039447431288438437884695966881424779267476774637829593166583464934604581144334650167118824800538822086155343629835193739470038048056942714025903619626742968332544699042764465947759672684965132116050419092249582583764658166144009056722704982058614085046045993757266428806406369760727435098872491840630828753856070612759879959607970681810623727227214695573174038194845213262839300623260325181927243721253979264299264208118138992305608725214160889920928102143281081666880995210086425098016379227875401858750019887109207015622348302506766" + ) + testing.assert_equal( + String(a2 // b2), + "770200899188038415975643952019467783662096044391505966768700843926345505897996586450956257910799596719643247135773073499015781856373164299831791644138603477947679444344134345539690251680297098641659070232988282988643391801323359703128963896475074461711111370529967344115375397386463298612124591252212757599431586728253150655740761754286477713651935576060066645596084935699888596222457661022614385173772506493671111838363015240396942677558784176611374878766395987415037362291826668629465193940900163315499143662207506025250452308955982618289163193178773757373375871768963807425453599819174399081860723656159562988938223426018693489629336351608168531891088147149994827156342705583696971900192135637146598567665662857925627775026314011675922936895795384122145033535252228382970902615934108233419730670128251877501163787050417397165643527126717124758202521746300963916701519409125898424163319713474448324442361252673655710416256385001669018873089762349244723444273239574987997879663750391520971359359333468761737522465738268855851287835189575243865907739139947028771761907895035039373430429268310364028964486840999626117283798992717400277663097308330256694236454837522740790246713706586936201638517904120958102121070371737359561149616272277652255989360817010211102642368127286433168837410497625643556351671807824175518600924294764541894937300270340916417572622653558666077702083706851873180228457885375056102316848689943358943803200272718339320483575995340551803102825240829986328589232879930439717146177821612553161907259536558421065701192291477403679058621078038146", + ) + testing.assert_equal( + String(a2 % b2), + "-677863994388427403602400659443370502101299870016680855259762912874425056874970270157159963220253638887587523225264877125370387320252190306065741401488175499930377873983373336742768235619757512228254392211134948351399352583974189842487907796217862651108090866423293527386430844615720293833350033661466150945689513430936075204599971752252369361576095408625312458593049851054289712364321801757385507756134865786827629172174904895707394944053234507428830883565468978344661392262625286168288534731386925171168716458660666339661709986591682445309477548543684350756037827341041339950060991207849979543012651804255049749081770239774028914577738392309617843085320863505741690157101607518957110217779367967011701800964711522143337114558216822219038026026035621370550325088933862006996331660988394489362718635887832439440831864670772785293556023515767689025425477123199285427153321057815194807475942568296393737779", + ) + + +def test_divide_bz_exact() raises: + """Burnikel-Ziegler where the division is exact (remainder 0).""" + var p0 = BigInt( + "16954418492742796940038747590377980394698941495284885613531096182700452252168406081051495882470020698180251953069976504451307108816580222675210002046681448827366509561764820977367896779529270101999568385390993254138775803325010096977093769168143622129236998518868913060830879136109989298387781824418815067694418754494772642860803124934444042850954800121544492981793157700375827680917521576032794727667598953979171710766441614380721928260298149835000584807306231065602628143020264151616492907915564452954056803243020490877009515510637467108906149545823016089177903645860179014330648893132751733177777305682210188191936356403291621459053284213937401159744528118102965583116654325251992868857803399577862539212841908020500364299088363604060775403742415158383497580495419213517281783044323502010092550145738057082732358790066518474007385008891855517585926457403370418985711896081575174222858977667218303483039928878981435667513350313895156545731540603257099624310543152723511730157098029602425709992768411353250026708969230501992373866644710857685697668761870548040653138073422741230380101080150946806469310742484075403051005843291142385474907847693709450538798115219306418122308312005253613420278971485336168400937437075835711629806397388163232920684990397358689980089842474908692173370938761399769506411991169764652073744417222757623928341658097848223107590884681929116877493072207292169493773597707292735026008554568715400398671050197906740360427134390384303446731306881328065658896146090387193587844357921851179261451489433369058012877717509541103117779652010589040951446445612835935823172791902727692718672917745521286741763692252429362631232940830023415175328262414916690933838297128078822496772424219456707577849480938108974535629472785788893351645648582330747053911349932703249208764103591897480307010788222378089710087017939299432577952886794120" + ) + var d0 = BigInt( + "4208633869401092687893090724538227905120018366820875056553208381780330164391132403294620671085688256490074765076184189266780349846882425431802641174924979471715488985177394696414610822204157450721347482345447450202523437898953172758232192337192177700668061502081261705079853512561003156531750166152532379069693658383071885774876543976150579377752061961247815199710938693104050444206168856877930705161080889092933481331471053689994391217394897590281949853837308419036258742189710289774719721675959323836809178637829317739785376156502171361418066198916697563523783322998397508829648285290528625747858222507252559691845954116519996896483084382260140015912252938771232446540320511316890277666957901530429049587018126780031755078266459709856752100699242155808524748265917436901785304420308453496903976532856229890353876795454536615388482668839142131736773757616634383310869166637707797602617617803988137317444624947937566047028130" + ) + testing.assert_equal( + String(p0 // d0), + "4028485018858503382843859870926398574152028989660695152507761273701956076803956124981212216476015796135824384664696719252685092560522848678279289937805101714742023352013979330347013516434782911335327931479847708148740134136172103349537302969050191402185076034027185016401453846007939638416810231491937941912924620123041837597588297105374018712383720076158184915643784878979631665106709249428863955983937780342068156047247633114710288498066448353358727474267131301733425809756948651367187956409804778987108961019736024288186511990919586092451017191483405211565744269690537910732945223221145421857719883915787779417356045225872425566865605262169217530598551013581311548839865223687660507968405756411107697821210916359018952083093319254595992658660775441394855849527443191594153779040694768972739306672338607265202951561203632521666619121592509320032647743612491672151783456944175729703726257954708286992037249522823159564936324", + ) + testing.assert_equal(String(p0 % d0), "0") + var p1 = BigInt( + "26271273953497072700303044731818546130299547949090591446061973782867244107445831425263230826441331153769793197686691404890353174528548720086104916928624295203840441421567873422689713816492351627881485914046845630852518694101252300064160673113838205667736708480879945026706813778781918845509191332109101514140774674010700630418392079996971178619846644206678523485919463967980963481121601729585720548182285346334249219230029441972599245540488192046866550261755198487548259144504897807796938094020092058054424743740601525222911066659148246556576352284984852664055096568636239999680913002837876335479233680515737714795992245767872286658294047013884166656743885695252973371632487618611363307886843689024707828613389526614265465847632032707502181250058376432318187382847741696060437328050471245516120861845041648711511054621268222134016286206448914201304849196306289736906833875316781663232907248949904249423520376064938802711962417475540551460082959345651681052174602380379246780841109647558869918127521180182587865629005452461627216653564829358139153779452037002858964699764836449405334975626590403401144658809755434697111537726354940776093497883092597950777358579872191427416674838372411053056103330499170467344449833577569144827903514001668821164928126420297310984957141856786979928335940342870775159198283025665861516766041241846473110916017519028491645800623069532100805638906106915267739965296708239177231210529763179381306358253968223674645798543544222004076883177463592499852592026984632224867789439384549052513514222047553418793178767009931753846499938374302900954345688151653411873303068448143330230460256543270074878380885526311366388880833704113761531960612400980971953285565306840440010969422653736194959698310529045102393928085603233685139918479498532145166182462020708491228760491645482546835772971374888200546503542387781874618239124306704" + ) + var d1 = BigInt( + "915267357298643201659291524320385622330837536345168487418957886543525850151828945056158116517001839889091213147067272742230284584392189612451038548073627791160685574755186514074626780929358569132780813290850532731465248554414912094754263676028353111251144935988225784342935405073642549108228342485497194206347868881855354126492611733245669466653157814441980652206732473851076135092177369213475590372826138109100154753428507132055272976770090403266519349452905007447821101566211547731010030350586326511083262704068397640576914264132832565680740073721758848846486182337378122980263294071058827328541254454321032085423125039987571912419985414930549024605801081108839878546011041219304714505226290047426931273495115717620936768257745181764078413319692566463163858693867868125040319724384429495611486559887551938029359654126098264655034285764861872200264803126055572048704725344337992429682139667939803096865633264791828806139118523231532438762963530647496251594444527176545242992162408977559494592263922495188196075319427667879847913809600482474589824118996081727230973545681838332815384578529081383870049756781146871716011043486787770472895755499574180451794537331064358762734895806558948895394989676424925322437287645963139677715689144" + ) + testing.assert_equal( + String(p1 // d1), + "28703387861482534060134142660298640710667309497984562793892904557080151145960302937680427997682043858291732243845505238825227544274837975402212823909103581567216090216968395882490636484329690102135967328077722652304662189244629102369998795976137357441547055389897218271058724560288771340940166528952537750537219321856551324317376302423760509462161711350871413878382862083311672969021250635753670970246401249090620282315284459799341017307582095786323128931250060610119768634496749548010425494608620538396670307647782315999616370255801264184385038285669103203319684015718572971519486496326446777858500902696905824320366", + ) + testing.assert_equal(String(p1 % d1), "0") + + +def test_divide_bz_normalization_shift() raises: + """Divisors whose top word has many leading zero bits, forcing a large + normalization shift inside the division.""" + var a0 = BigInt( + "700650043229279343566999965541711975805075936145519323393049306553512984750049716111656140629966106373740390848873040706908605200299102234323873779590876751284007967908523295472776444621544402661698053869952717312927535739489257343779815077249511963786924770147293006520945462808231920147120058059819324142222927178390960364501498161196898227568438155336032285024184070286059005394146713480817071024442170339394126704424829559533551969282088509814729404745450744382665206959452859932799495495516641978476786148624798735888152313823138777745108748893569255682385580815941474941863000425306974658729719029007546469597463845592685208136745165133893686890939819555170443318403788744025355512025302458156750457619774423759614000004294038344716200663512550696204972313655682306248753058117661235741564258136591134672684664575831026893899069328500201111262852007043406253925638088205798322348355748161264778553643466616353491055832227659131140986287979923416320578821799268293286232835463515015673607915666037594985560707789701212939540221904277236776372726085463495098784942159924019823609547680353249673363535749260374248285413243156247829656125630712333793413382506574759550111863020035790839020755929968801781269264568190611379208901435017304060992296659255916842046712547391211394008416055427132491913734962059365349514090354647472833339136949912303674333321070266318918479277606798768057971321290862796127419266415919483429830862669090169659216917407388761675756822469657182038544155819657583909746424275626635078806946435178162909182210082984961187604969650436321430812162309174182948701261676235382167773124422724258721214467656862194011199180031820815412547567335125788967414598871399991567719743257538014361991999545663856002668247300982120117546430157965233498849815034506764512071041496001176623225636983777012712189317323271814857718715220332505260585312949965876282557620616071461655488425644217729572131141243720929994460593111768838421614967718251065371546463108793336005941481971267743106010604926600515507169941193330141827835628494888823826453505623613300017141053279513126756634244480598267186978263141033998063764296961981350444120236515446736051226070418245039371273405415579670654797183652019738993465532005615965342441940364265145747832220436009036623538224164944916324758892127383465499525852825041736770488798919147861296211665756122028054874289064592176489475115602122539142847518987431832019897882248029964386897823693036914701294913618375375000" + ) + var b0 = BigInt( + "293122819344587364143756174659337098342538341350148693110922571749437860048718775667127930267125830608431152729102426609111102729692952199189161459799734958172663446247814860321321946299226576314162209199082846987456169146729120207475221235828851773987385141451545405404562133943297471950217700580129573607331663640607771883065334825337863446842874319787221558598746976683301307754938793178439915431050213785349450091087134085825545516936944956872768609777532588035355888838483887402065537919404662939982686030300872631023189170663304638587828610752828614636518666661874373148652127645499067250448932608140138000736964595773726594833027538715903152558877587249628274185364866830415128716932661880409038830715301846418970365004746734049588004486320082456115672921176055023585479347260816525637766763994011863441796421296951352484546718617330372463538469285608779344991350324810881681140889223472158487407035479127586773185959571519291608992000975043154626880701314492310577562034768768431008080277730926561866813140015604657959884897166526692919062183220003994076016768260487167197794597997076400837475941305546403286365626346303440276396472947308100080185733226851877902776513713260957617327284963390889888956721604982828276186745855" + ) + testing.assert_equal( + String(a0 // b0), + "2390295115187241189499246988183900632158995068089444875975902232431827018617355712519545725753313531023798442549765829077857069495894572680899877322505987278929242870554219495060924510164522718054562176581061282541565573605820914203184923586402631577037991140469592882992926629246125510802798412882918181355882794282023230666483204587329259410751714811107600691831806183543151584062577833177211874048859330341142530788558804666767360469524184703154904429784391531875291186642343531261166097267559727075823930656893533111384475935207443726501969690998804089329007761270367178666221388412540936983697667276823113228784365490860638551615494494011919519770971053421741292978191047205680381224869818607641928414479886555523193093022066326909968914983316915164319830529844639475293151104749380775216485791381388227226405121470317453084814707777120996685996000526830729664667951331083793616854110211140025520734933792887088532523451322718125483560405677968138317058770739938076412493912439243706600148929000913532619393399293869567591245127134328519768312425661723023815887931619529619793533335957220005531124430208278984423712424990105222459805535789438567715141583255006292794303515739574748814389841931388904080527851591090077237728044697", + ) + testing.assert_equal( + String(a0 % b0), + "98287514209347887396826608266259193036531595074600772542330890870702463219425164694874853396786054201676394300413514608658558463111868527289843984012803625774629658178589508679137056038444405009873918777550625875764171513815211902650561120121731335031211090598946650182450702832543956792914673644777103438325067615683597034676018504595304287839810178863501201821853852693486736255817390235232831785550436428837693722556119936893432660277962900201476757832957357619678162953414472088217048659646445221321096953349108161761510090475423223183615280649122369296266531370515449670771599631338548517246705513024280809166853512935774674399712660106774584262581838247468485767615148251095481548556949708397856537924397434544644165232224153981796182796473199511694639593471980673090308192036670661380244756666626230070933546923550231087899556797635935358113613833262954862717657958660238807508766410562924342450348308671203798172327438510576390927892752591496073118019646028657505318061447873564960010525473816215038870349972048203534772872608446564701882475237035058224121089526020867761902406531236518207765891535691282129864405767656259860010363315626805167409352562717188923713760672142802238254831827179355449785057531115899281955894065", + ) + var a1 = BigInt( + "1013943649968249192038907484501914569361811928359269533415047594889529737233621336334108246178863923352791167874724799427194893931877517214964188133714477102906591230367223845107063362107023958994803696275878448245971752710892189458202995932912853561976177119217043225485894215893932284646688848236589875997168351287665740065880168071869712201463612098350592782929412158124318754318728483117962277068627158646809563966871177911491463513932937407211060944759355936988596457919183273188199993903322538328716721976931256813532051985726706592325837482665277418303788683588177703071896398646887292627340920365340828285045653000185297203283224012768548255309192742738157353435155711642643184172747765355364995593379806677044220660534211058684629785801794405205173699905317892897734530309773515869455179454321988730422315171776652167058733203446616591968126024852847213155031333441813642173693029830666346202036263625431248715585751345734790181635313983610230913645727685597199446737017125668071033192782362911469997033144454521812374513418855389547634086131457447976334392060218784387275461936523822286845186794640849545904800711697899109453239988506652013213156315171655403741576254381961306156666435590974866120973193965149603595483450288932121968685169984496200565724306785128582798713352210911857127928739707501164782538537679220076448585675053204636997630508861918278981079095794297072352176834048314866687256952855332309642856679910050566498740921692188520554597757557910654470641320123662328700244493232140664855957019191141389988515867206095421463485170587006292134499771596736736609379090347723498405695298077186110682433217135363925687480901427660836548877734238087463086461380420039017589305312274148689116209194960239085352624389217675148952325139324097955391733512594997747726749697837438744655408578852786145299129042821593503356828223739831010649171046952133437618673620325515266149950072997455899260603334963048166649784082834571872159765689580115577750980834067599530775081900895665771178848368827828659158548698856796297832147237805962028057326694476216463098486220710743637547667541734691937804155430228732024277082341893518055552294348269324443138896862140602068818284056018115751760300794386387265100528570911608088763410996523934440762537675460695813847695841024016591089821679076998014021896633112837015807541276562848094982487067962868526364183966393315915364026233476898250811084348974772053407334546674630101010384480028282963880366924418206434554" + ) + var b1 = BigInt( + "5342303020411054171473966104830681256625969090961863745727381855733844876387055265257673385475755491662588318845280322961690043103960304038490400362067231142310585743632495524954284307026481597596309843270934944801383303506425713089109322484036121670231388990546211397259979611499439674274185408240369666013737224090802087241132919090382376190352305289223373068039504604533480421544438835625826570782133667388260391768336670187334713273543827991362852369623946395123774142037797512406131201781055592259390597899309349432347599700429860276445218322077504661684881830205175123280023906177676862687765834462314409466199944863487252801617385993650345864749736086630075422484263259900214953247938230807009152488640091567047605581385478817652211766988007989754813199329241491047450739784054997249417845397554981356673623304272329346166322503808713609885198845840998783183637508787276119293479399574442006022563297633322455179343841356551037127286420618869342326045740274755235113565318916784807695411282104878395678179017179086129626439982007532699842832506386264812611448410719584548289142633835807469381031359176983943301240643181823023935454270179549021673782536415311560523449383953143277675559473089740087694007390998086603346169281" + ) + testing.assert_equal( + String(a1 // b1), + "189795233646299806768115505100386627743883004379810602934937677944197236028513441154387252989204453453776710094785857587675356950481988448885463047398813383963609436623560387702624198695239997799699906963998039145785033659147233117710781920229119066312836682677196168358001482258314466483550877626244282350280013488433661060692614511387101977703655391988954921218960478239302826822467597685426433390520796798758842378800152934865220436956856021260055299457578100305927767648509458823188547954768252740638021654920614194448631310622862120196510061633056906439522499847692269128196200904705423229346391668923228555533738427032028740541546206619696643414429395959644913715972641838362817833301719537197894368877068610087954540209730256071287500606382369983159714883146844042165304655355637014054121379963228519592465323806464589461872511971604580799894199699899374687395418438384232460407472443136331406991805290654440362042265875763738329046495611563621268851039758361744282597979733077417323656622775070433299502160620340785486310947371574413654140382561889363585010598377586655225182257862654687442491417914729135556542563564970601309697865962810690657132910303394011149634021690520768590225359691009542223730683748529602648063533185949", + ) + testing.assert_equal( + String(a1 % b1), + "1145879059571216421812075987998241803174587249477433932905947027609224471225431316661945235307810199093008317076237519271572055695493637969440007918386046266886480884735362166376186874427259020416845377441842923196884022712743327087805069568572861475368059998727789096120845481046098439650974813585372873038261554478423177671255308837236690498120924481406430533339225458187264693292448134072129792437088188450314572674789857491096277000665101379300534339109247266365358917077286330530128444292714825096749762526880883646047744212610641150989937972815650967084045583315885292268019620591164659776277956555149627386160419590786457755064972997901330919030354819033504859115881221345691260616999745600927691298202180378377596125425642186683114160834975218340229631217215650539759983744064342126866541260227660135949344581237523361157696364743674326906170539618174568273981728615099666986240746415028531450282316505098685237898098587009734494701744334373616538627156780840657460864358100174871623023073547854301663554445027784996909300382552496418949684755712869462231367616444988139154322198342540188512446578367685239132402880086050354332517791445905344157017987159528110655994214248796367235409814063539094019079132912857871601801885", + ) + var a2 = BigInt( + "837013871585241732492949975337597842219712863083143940943652936339799455466935740899872568918514469444993724732454980226248917041397980310003082021744372653726911020995057266093899651919852104940924027530907050243282901551992402372243260816151601973599196539279965698637086876773827751049107439650461485800035090218856724475729069903335567305389511670588860563894888432363132718688866244292271629696554800514306561828816615524432579868099389359158203999166216217167925396465766486020117947186046676880229864783865377516292939701226856314763069899749021509666431131167638160660088685643203774018072412321145673165768399873032885171640385070216957904052127479280309619626830255563005720126466897406790647991148955869167596119974359638948365934185374518709409964851193316952950825926953415257031720843253775926939312829410564964549890740856239779581716261341323827138223337662026263392067705881135591245381338634546367263230039106956178167666459104847460754160337040996175382573974302391784143322227644481479641394224749542896594908921102711693308328893044642257245266334895328057147813174241746732211577063254129642764853025907885878610704637912961387724150114887182694475905599413733590015513031238799303058911029759394288504243124478431824388574221758297297641124432784516066473545744025133993273229976680630722466010559328453301633204516602760755212867390140398241603187609500330944210161217551161198668705542105379671546727371431156622294566987697605048362628413349246521341500849306726120074246560265104239776019636708182208147617677505749451526627504630201692105979533423448898516299829173582818605399152922194012597123642109292330339621571093031986305020991896175721487022711509301870824593713174947176640097579434234496841806701084219808083677781549634702345885402711670627607329074477768749310056771083912571779221317547755185059702861738453105633674125904480532306572140011283337253049609739112058223634073707073741259399475197553995463854827526896199991913355519391606459954101458895287019952016565568285758287247393765722309177051252412812595264167191013243048011292650599198620806044313758102458522631969189335689980899221978653334247418728804526732234720193787484174427957629657763942136796187859035195404628838667436545342316944295241011708663066841029363730158818826401509273212044462581505136826140395129183604551366786377860954558841246426132046424601035806865951042643800303111119885167741144471934711810260045436863682304864005252230842603352995452" + ) + var b2 = BigInt( + "344920370376589701695447823308889490558289918171001240148654032065893743596899646367487349020466951423715390166970992097753961090319065662166728284389981255969833489811585350384896178949262251473344491456000365381842335093182494016793260061659014131086615385575219583027794896129603640055283842908885888711796120523194293245959368491135812976542111736829038200607239397525187685274143290471569016692416393695000706383086597820108065529035344825836605813767527588088867462953572271241960015820398986439405330376029204106026621193632866220483234482036517035030213333288171985895011456631222587795721894042249003511374053158634032827343045781499535494600586761077522957924569262822668584979834475625012035963075650796424068370103664426595652330885995156192862922655864236759602151852153468933420773797677789002033551779927720376032595014902372839198677253159900330272555756394392143399815142342324213186985920092680174872602682967119432038355996792672257958202430046763707809868603521948765025624529289931234234972662540653019417060960463162305254496421688172588232367738839302599522849729284432279790450307064392844531263189661618046290266103948356460869577718639293025895398338073523889924535577751421712495942234766092682017" + ) + testing.assert_equal( + String(a2 // b2), + "2426687268923480215972502841455462630144578494155249207976006346708877995982173799272866506386729762051258253437618286575771835037676093423063072669647239079437573558993847973331021573935002710260146480222617716203493301992633200798580676543314692164559691829233459741856416846174836643712384766907502967258036669897923416805060847258900157046629431090602331131070660319639405271950017919161659689094957884987701467164698464060706145901289283189556474912479609399211804248083931617428872481182630995874484857852650380158743660411244612180131841986986568725633087368498437836807132663959022981701115180156061462263002071012127893760206667207956208359343321088323084376382793766593678790049273268306452084907361153973217075570618389817238481991052113749249847907111316916780240265348893765286236852755412006622366235088483530700846187033610550620672872888751258156978030914939731224932342997688325408226884152921606931720363104909224336524054230024300080285988944873103015631150209781715608381062334027049175533460701051076373618831551186058884901456299131526864550234137815087929082477353783193368574062796083273447239419070934870022607094044010785890568315097465252278866442935234530287579712301036884528810942001891582709587668307168300885413", + ) + testing.assert_equal( + String(a2 % b2), + "273277681785482048379094437170148352375962401783545553121099748041485314107946901498868793932728642727716832505051365373890101840245035063262355768959988278424590707259894846298322919110277226278678839510891149087630690562378923342175615662177691344894141825014297557254372594747134811154549066543732977983985126337155015943487075893558776487167042723999833937007992544359920373576943558401539258481590363994566672258160473162558156020985960592815358126704593291256983548970399152158939464245392819262572540248448854869242675066335519829816535338847123871584581990235038270063570224474912936191713603929543232703223491623511317615074326788029818610730498748747059661516735218305785660764928805395746198509750566330950872256033472949588367285353717330624982261410398951622066872487139944827524624474111710768540945180803752266037483322281980005497443907432174830351258439204222082128887407495076136332728705405983080552358483393274356062423749016942522671770583176750871336834049031667120501406168563698970916114300129612043301540750846518997607552305026431160501397502129027357321109635679292181443861770484540986774413051629973631090726293767134178552806505025532108615265238428679268932377580106388225397186289722390277431", + ) + + +# ===----------------------------------------------------------------=== # +# Cross-checks: identities that must hold on the large paths +# ===----------------------------------------------------------------=== # + + +def test_divmod_identity_large() raises: + """Checks a == (a // b) * b + (a % b) on the Burnikel-Ziegler path.""" + var a0 = BigInt( + "828461322221411042903086649983870304244524614684656847466675970004802100757309874977371526537413569942402006391366653175129269704702524041695526584590601046587819171502424668742662156068572474268349901019156525391776358458727142047787560439221017621242890503275848577043533977707524479353997079673337792464451765224399237658289830815031094963542447526520640656354105761215489270831525367719370897445434398266064311744984405375325038003379839938574544865503845286934705168657884370142786309526746047475064558002917389185549940743746532347511363309232539702116718901050846640678424210468103191969107593957683722836711128748141061889576817948553609685599370306292735293371862810916029548903456543893784022710076088484044020127380285003723198996718877220171275319649016627602718504499197205962222526261118922058265663819634865842068644540745294445823522028883889215904563814893976141545947732401947832604537676211527232287340139308488252027123961081547355265698687606093722588299478117358944427073042690620151151102381320934324195913495017988439556910226195434331390634321399218145273299111656420413086746936779033023883633198794145757500239733508311481194291074237298443836777714778462895104889351928939292699702184897944287684888077501840393860157599904283719615598129624121209296171214103293437935124963150294038604877752270107186447839897488158271252623438290695157261041587784748383020737406361095464300648468948478763756599719322422263994666892626113538472268673953160558145738314338712521693561811396783647330048370332837159175440563505668658264717679217546593739813969339321723682554050252319101751118505920350314149185489879990069330447158978158535231830680947869727500537386869305318735097701144394798343250588925261414410800676974743537935252667914543396769023474596292119645854605180082442659692034153343687182415232978197292604257465600420677177197289546041578781211085876518541401163926825312553629048162198772628582291237003570629113099557371366829458836747021949612122185261467905546856381500521123820629991967092074262634421229275347589924711634991459185440635254444964371794649557628315206142490744839605877776294381799383725305093814389248657148163645404811346140096869350580976938676304342859104789923993033080865529281743258729645361575018204009875770975547968088076123501380368323371071126144542074185094977279175545595788015856607924901943603837975997052921599978672684357420291688706796156706672409794622478272991175324743125641630183741089244335214021150324422476693855206815080130806850902211343928332183373308054162233956253163258829321665481802123784968654995281023120979290393621346612564992315907320454340750209779790513537239679972184788122650676868040796157712418147067976028652503205004541204553946421849555512854134614597428465221672348907197942511712804904211289104006496807266829145289734875396870047657179111539058960518979831153588234864727000299926518249860136622963450470367312320481068325449669155653740905220663454779935674479798598821354478095785690063715735672083272341203919369650383807399032195775260951943855870691019499478488141997038410672005401701273820445611167657941734337311889280879733038240659917536897109108855532188732163153864532920875238368573885280865011865238002697399467682522709252593524266192435938910129978745720335879311850787730470356770879441207800985699745898598834651261935913234938199630386618877876151133961226262527226313679153667163091565330134359718883147891614910620596126304666383214953835222616686804035258338511538917005925499448931915814831811279453998698572813333439088485497237700883131510709587207282627924033159811220844791924637867366562910239319393308122258800373874725546658676512793943062344031754296771856400090457369240010437134276491100720929466149494889109991863700211816361267947396881362804542394456992515556331033748666972935516447986237191600518138743939671360302093345641674724590431439403323997826016911505467711163605161609872824076810102268627842288466836475574628147970021114615752531240857017286165622973056668783292035342608707224740202952008031960802161999994567898643959870137620169997845977343234309026811693917512691024626815422259369819842713212404559479217171590490297631482793819884084843391422851149643272652248023335949928772301493944642362854457342296607726444135696897899945691002358028664754328455472140289964483032561796849592334916866672355151636812618954109030939726114901650779792458610654583165584871243775426788836918327523794766773705919557821708240533184981405130972616473833117901785744703869813341349889601457151967976347541983767189453255697648583747138101863925000916699819664176030063865123845534749290260371795962189985337589134766355967192683157206975691647780883707674124084613874952605759364312933547692196997076568919163575648617846064437111688379895960294427594454757495110727290362138309842071337429655515278798453524142606885845507926377302266085817925452096171376337111124537628391139501068622618882" + ) + var b0 = BigInt( + "708429428248067645152862790365393027454007160489783570154436083075079982061066918742172693058841632767738933357341422882689005033437552297756023290244607941816328172746772946541120056697349212070102770905903958430873622292814136277739921050903981552403452685905007964518269347390243347694946183706373645569908077441300161163508980283110060346926362009518496223370409972411920156471469085932660782377279530879415483610167048043020257900931282121625802677295803909608408376271792257113610753676338025548732171750600299339551606406855505902607300908710990458627031467357633172568425261853898449967733389392772717537675047702509652413510225897657042258951665784675596920738101620062005113276324030817989762862002853335333939878978161773932643218704962235542683664981326853924457713298671972742938839905442616929244477522777198998093335336318814105715207912705437275979011295973790636782045361473031307838944" + ) + testing.assert_equal(String(a0 // b0 * b0 + a0 % b0), String(a0)) + var a1 = BigInt( + "773452724218365373411986268371638455504600925908676078017723052965949534953846766201438829981904414036183308405627698065739771326285891933681033545365621367298751335943340749854369463270500534010961985574710352972721308430608626297507498540710279737637935186997624974085316654534886907650505594279890464035379315367098585396101647841714689353930463004346044953992199089638874793285903426843445934749802225455725434179479069225431717139726289181687493293988839761746829935081426689160803863001516532636671760831476828481133558865566852114093591132124977283212726056800678372575448561660089572152179307519125801847953734595305904784629107933253700267779543470679249465289224165313191332301175277820021087733120664995499526060675312408236779177892969483733970049197894567928947097691856125566895213374292340561825307172570771740827904169811982147062763997916825758562638145314275871949746934079523060770631041485467150656021369329598669616840633838315482206072491620600370422491593683586618890591148810173185751362441396332105673286516064877367102381112407703177906215581948048724871439809228250794054112730538621302946566898963245567474745124599179003469798217383384264328682656402660468605111848342016772191636087438521000722604574957623240911151770484905651863726619911492172204688588872525263347358698505681776708456499949263326381985846084081380944941080528388535483702655815519402594244876905033115988242264753909070697173046269744332758465404699639766647437256063399202135752095662705525966620710070845702515597138008015026306195126770533500625452075962058424146333552164616265131316893457634281624419670837166026418365967367253997751321797132962248260793598117351971125345016445687151689314995824607240900429682534758102209038708523956391933531393512953790216440519664099920741239296732620867296155756245867435738122548705165378026262988005839493258181108205988907444029873132547175406414523158284616383339234495829646573536973974764486249470087738917038099764479539346410298890736116785850687842845186818434045628640194894345109759441538109296112199478352795777855187268923876548113580425366394537822865730625029241840981450900212274467735914484869463523007409500273306784399582292334835765845379990796072800759716022533620217595109411954721865375600131686479451411700054789837221051104233570754399853736826750839514910156067925052854301805016760266950306007775225568663796581459281955416918361414203933562357880605477412722286274772528628640148878388732889776008826793480416517141459443284909897116939817222492232485976753155934877004155957954388305442819010815083790329978481113586007600133550895382733918373527925785548509874553751326382961983270746551454050200654874266454364549640737626646577601357152599602592985716347908090695467641895782315243342716813569628493828104879733993781570861793196877462488126910482467993042734548952056066513206272434278990625331900034212123630192119170427708191564382360711123720001217554450879228248396087668752697039528036569695007373638394366605997957975222500309850125283995559371157122385851864338798799163621504468533297635194260384810040959639941262592545449575112743896091286093087104189429124887821487101201033571983750735012219887573555625630735481151104135050650699269091966622572339247750561565028702839981882297352871946942425763029948110793695777522638587291951213035767387979243467939572757059549925072136101004288795065825108331546110066094542350970387667531754634201044568380777721114235464028507213605729260966038367280145970302799555177641334172490588470499330794290975805404277123641181768990577176971458168516972384861905997389389856036381722324292501538676029073071291888660128547402813693444368111309678627004743834819186508235009983028705210872639364781010325476222204121386785476895755331190098390082563099308842190421714752030603659787789830735592195710079388846347177707107682039031863989135746000034839753347478093383728488726132685680682216085889276836180066446863330852695063548318297581313510325297198059493763220943699500778915859918344716313794933042226636001540171561632882278666486944875414497705417262581254125288912306947514550228922085206822294822317235271733176469876599214943047582811707819662618753853982112665817612112251153789578365200782729083138658379222613293013301619894719717531697893696792839879633930114687861707170629898923076561042521499889851253287548093545333795977039911395381795598821555579640699380395723648790307722767723948427599081917827955362167669055810962162764749869758401483851530831061160084037099338053650280828936433801173383151139727104642650104067210675216692132237018308420213230722813223303928838717370541918623663080976983169360104196458264954358846554294860663044261438308914773103243449065010206548789328460087825530488785493550675758713591354731438806805194623600009109493001047087260122888430731480213919556151733180083536091009747517708058451357129334809440759633766016411463911145193318244293756148355671596642" + ) + var b1 = BigInt( + "793746987628563096198791292401973771347871767248566476963499321474962907339217854911228165001642058686000013246176575010598207520970154570819849686013623566652703544835613295039257339013735715707756339439088952964286978771693749916413907993402267316176670031052317304710034318777993570500545572671154800215091411311922702249249251999210606895890748181207190826098245064512672853306884161317822784523025768150783389470851093822029012323463187554272651075133759179823205432372026822021454911315904119747440726990427387482300175757036540593106052917186006717486835924568101718742553976295855820255432964447659075454058182898623181108861194989150275398794076644480930008783330689921570693936147099066517475363504280478474949782349760398953621436448747632976515574598427748459023287556250679108858964401292414115812782079645362988983077019885637746833718409574982642348839251338169100834266488398805395944575" + ) + testing.assert_equal(String(a1 // b1 * b1 + a1 % b1), String(a1)) + var a2 = BigInt( + "1144925579016314339365765914426686388825360586890671042702386694905783914503316148867397557268260130030261354572965504370697306175026475398161944249997891446553406977810544699533507905283004388458206242553343432775370731896530097989992366757731527246268414589764334959203815936360952948395264429479899838981401501726260975993993579267654430823519428559881635056915777674879372545977571190972575037674080323027621232547384523104301922114538894187964716489174747106545719028588836247003584261526851286253530301791839535574688263110862386221603451353750534347178960243691061669791798958780946616925046133063734364641355014706070039642923839562375492416462482555501250777387546349011757569774497314125491560518616214242276165923304125937285531959764295477921035274149996975732955424022609562887760591484039244559645391994829062063616411674150294446487736653088193196537786845345702865260383534495048979490360173473969491413505601779250811886408969373831160153258728365745003149914717631877584237800012387574302128477108072412628872206530155104952310722139280418423752318132604132750622985181881502039836364970653358084658743969597649150266316424476702035797266770690276803887497417636007068797285806734212391103079189386422177506453836636793763364300296863620019214803432520210459535564492723206426984335991871543924606934781960761810431078881980480875375715524046849743961018858556390702208002944620818668238531160325630729331862994451562028633952919718927317146219875611222728151135358237394960084241745038678021198349307524451779862741517759334728837456329645011825253982040797155873612985475986720078772756645854681561262107389259317310515962876384276547658790225916635927516896382128163885852619797566878314302465385476568798242746700888387485495733451623621837046121379888843568484401513234160025586368865708723553646460090295998455447856943715372533677309667740188478445577415213126393903159693306491055680427312287160828678798855658250590062112026644982368780939305062095409392747732613357353659081111575250781567013367424138398958163894103260438651429795356870187112774083307777844769322291528466889794494970823328344416189859575783722470354540015168207026249188456397230985742257947546301913253448277740175536785241210002599879339357015293489319139639957523176589770510350312778113880501066644051298760796708723001972920019950231912045521012608485430975013601383497733039456903353327243547281819388899420882533879234132826932779895487053770474853524216721982692810550930333299771749093932864759699602715445378749394518435802458853146766665538462061502935398634813452326934218179643659999344395571463704922448589038244145665451066812774503570338926286361033695211252733743607581531411642388757836991610258241341728651316144239385969783276854894657054609721812455651012704587926629055891790810270870649960594594316184836914221026572750282968445024259950016802629149924363121344664886301409976963244485941406672411920169348764373793226154238230265185600773288257679483500177465171592823952759580447345484686709253044623487043599175464356511580666927730901807124212597078824472757135159917570616665960100553445433647281017196388358139874139118048885902615896445256195084512924219785913541776059940499743398807340252751109292999178004995798214146854138795882529934533020772702610588226368868584758042338981841458911935270810649625007558975641182037142483797466445715840982464642061417204963099134504866718360028045366177152870818255837204604832235976194781464604412513189705060675350323217820563231433416273569879990753904998685501853535525467668524517754711302992571388388380148336039698409020655362977397775697285588912328786299134848298814802462423583578448267034478739298625223635311767631243049646381537171397702130558089264418480973697804130037946037909381257614777754804333478781617029916066069895394178112196119494328971613430341344414541160201750205876311296994305498423846174968070349615916293449785020346727991391944731984433462812746388499149457888874041625679264062511156529336134746070021518613825052025243685905110815823974341119516599332089121139011425362467614445230588299941876149811327279579302514902340110564779425578955172989491881617401914504546014067660695275212771902851714383209230555953636270783096329964553250983626985094775262492836073855459851036319046014061529584919327008497641184249577668777302471692439970341526251940776000218966089340508854238250494789478182201270323644171769303234672471798025301259198900377874102631400100468521149473591468734643502714832627636217821811979612369585707052521405081709289046361819955953597279190327331268468428543186012619130546811157608967158967421306421097374927879520083419793616952057778375468812567704221311277981154893425898346373103462551873687586345953346043390083855559354947543067663130737960909591631143063859948250095648814664899872192279269951903087530690805990040342983567475723975183996468409872421722804784445041022385748818896652359066909773585562" + ) + var b2 = BigInt( + "1131363100578461570626705810504237972534639290933061028970071497793651938608466828182198374774873554430372984240049610225979454974548169186412002349533471442836426894607513484913538968282494620613102594203366327010061791331762872726887010059205487726159661900070872843178957196564256087479857346900915818040580981284322088597132318132757050564811315815388246305574712819243130378504184856752972686597567115634697244673765927606857231286487643880589253726303528678523670435732807854091235024930491588888135716592703623330559574181574534974410997781273913218728236749937168992071416496041095131867040941994290733129986731234996242828576688992213778650185361965294437124193384827140494720445355698593743737953631833671224255775002749684076124768335172755583417295453628765993697178737701908521165810868393845675244096112202082590818321148188978346668652004324322056620786953042083840640346687230127225582070" + ) + testing.assert_equal(String(a2 // b2 * b2 + a2 % b2), String(a2)) + + +def test_multiply_then_divide_roundtrip() raises: + """Checks (a * b) // b == a across the Karatsuba and BZ paths.""" + var x0 = BigInt( + "827477139974202987397488656149513507332697628196895961689532108508171653353712790063159461023750142157892314803031396972485209566022405834013662879483859699192928166442579858079354310252732469128414729840521376622357232108473338682664130484482716649786380158579368635081037557336871169349162859807573531856304123492439615098846971810467373172066149377251421940300105539187729614328191617188912360579117048622752384453094922284159135305443869899184691801301870081181842666407266470121237636704840431491943600789258787313192479185699511282045142848784449245516114364196551728164272361322044209895252446475759035910223784568863768536799444148060138326276867583738215772225906277457417480965099763039196414904310667177832062861244216950209731337684782648197538667162446660398731487294598105355916441934222157801166889895988964154520247323254141301671660728642777549475671625260317791758331273799468900515295836536474691254263706681948670889807100341060106759487036209799855710760520748585053553289523079736670282837753604059576853011234114310718726273605741255242464777726120516298625782477035543189153299833978667583005424659266485514951911759875613462052727624516014404775717698458768542616731344105029225206654886316410839017155581052" + ) + var y0 = BigInt( + "1176887692535736061965336369993682209252563043380318937276707830884207793884672967793727591857025990065618151398814457870963931396813432257031193248023248353616381852522837995346376955174930498935426952456296326735201173831326756163250710801413700143301333907930392771826356638920894412485129302580286765468954436010094536214555666852187289999260907340872798797141256469768546518964684030570511578055644484965047532764919435859846670913890240496548197148687485448933244463299899713044439505182206205130702049206164684015372667669381540552498812570409419595820496719183947043685988578056391535361919924817686728174649466473093108936750788682998928993119441755271457888881986225240734592304944593623502528041839239392890427971290057323912513304076636316267271705323345201228445692841126793903985683402224559937803024223256673839492639079272011015657230587965167656430619529221288252734169200247158883224009" + ) + testing.assert_equal(String(x0 * y0 // y0), String(x0)) + var x1 = BigInt( + "557672761925225745544338753949769444533963961600159370411188682562028001456040242234699237526236246005285492088661308293259484693377464953602887468544263164279428702316286565743268807883646363980006500415531385970146738507477816482355354425558144231199214695277542423744213102448101517937530955846397190547311649364457983248399599275981971505668459259428997074339512926998484838873539535334594931925742442705212357668933985012337101161225626281778045567710793954194008792145874136840439816848816961716031310336920365167855886471650756366390088591867840164144324977749501327916392536402844057291881860541526864005252780381448672068084397235595667569192942186040463840233020289875938513983431416783789422901430325691245662181134622865172907162082826172258995758499244151592606160341872522114413270896714937957720568735068496021427781613135901563365443575832418605007947561466989962021484143046676672834601511532171692140525431521986838208723215076023699630480690343992592643473236207001880536339560307195242126912688678503100337932502674050273392457745458848831175202294536488124703617141612800191706082214382508280938588510638244462430448463740319064250518631973828800209434871501183398510778322137879598446626102593112328823048358298332504347719330772850014881920253833824618504685195096564034312434423147864392361451731038851433695365289281057511398925883436922786098229401241479637609229074065230865488490989201901895093698234914015927914776777026885937621630050356902034223797615714237856254270619324879035043274011181482735712432416042223973395939744540792261985657289905543650267844687770956951307838502935005980201283818123029393182199122331619975805330998405390342609656638064104547570503713779866498155269906975507878331875256732863704811211347106488519432389798861516566956119734844274045788718619671049687798062104437845776244742366021164373910236427323938063903901262344119093359164141604390729724930263657482710996185318368493533287599964906901967086749067324245164730838370348011032648477922064661704034963443982798549798217177113941427098163000937482826063117603242002766005978857805914368329608283916768953803908030155595706619137863489452784026853578295244790564649784435443886201063429923337014448567457560534766425897605305740288947862770686224729396866289740692129020192037685628009212104785178051802687697061262064294490773813961347419681478476286619253228423796407069514585191873215914410103102036339195774862435585532379293403603109725907946900" + ) + var y1 = BigInt( + "692264570782528234971521116009001066789199968491650228670198495525136879074064225153653855526357918332984343169205533675898161045441370922366838853988434523339576339685196446114993483253702321227561985616506705751407934315778624700969573997600546007400199762727272768048372768126349764963879916677781610087929917878034703975494122800386372921078287808648054202538006058234947816117692520496010402254364790479784571074534093961274382082284967279051273701912889200484700812875039305079343340790133276720425632148677775947351447151427573234867218434878869657560845390116925714532267723257977995080087863235111413163182079280080975053822786966028508443262968156253054574833761413490746898887742153046305344530816174017379196314383965632689253966146449176827017442606534892091101349335183958306007968041508582358524663759978651135907373372141856995302697990758248608548671950857662489684308514456259580367721239190091897895346818462992437900991479206116955426604851569434551328522563269498510603432859593273419837760392595543780928626749982772008482329611277202046015595353865580270663625970894867164778335924859106406196812630119552516091267470175938382041990660264992681723690391974958493507352862167031005476603198287796304289718945705" + ) + testing.assert_equal(String(x1 * y1 // y1), String(x1)) + + +def main() raises: + testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/biguint/test_biguint_construction.mojo b/tests/biguint/test_biguint_construction.mojo new file mode 100644 index 00000000..d0c84104 --- /dev/null +++ b/tests/biguint/test_biguint_construction.mojo @@ -0,0 +1,142 @@ +""" +Test BigUInt construction from integral scalars of every supported width. + +`BigUInt.from_integral_scalar()` is the single entry point for building a +BigUInt from any integral scalar, signed or unsigned; `BigUInt(value)` goes +through it. `BigUInt.from_unsigned_integral_scalar()` is the non-raising +unsigned-only path that the arithmetic fast paths use, and the two must agree +wherever both apply. +""" + +from std import testing +from std.testing import assert_equal, assert_raises + +from decimo.biguint.biguint import BigUInt + + +def test_from_unsigned_scalar_widths() raises: + """Every unsigned width converts correctly at 0, MAX, and the word bounds. + """ + # 8- and 16-bit values always fit in a single base-10^9 word. + assert_equal(String(BigUInt.from_unsigned_integral_scalar(UInt8(0))), "0") + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt8.MAX)), "255" + ) + assert_equal(String(BigUInt.from_unsigned_integral_scalar(UInt16(0))), "0") + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt16.MAX)), "65535" + ) + + # 32-bit values straddle the one-word/two-word boundary at 10^9. + assert_equal(String(BigUInt.from_unsigned_integral_scalar(UInt32(0))), "0") + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt32(999_999_999))), + "999999999", + ) + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt32(1_000_000_000))), + "1000000000", + ) + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt32.MAX)), "4294967295" + ) + + # Wider values go through the peeling loop, whose word count is derived + # at compile time from the scalar width. + assert_equal(String(BigUInt.from_unsigned_integral_scalar(UInt64(0))), "0") + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt64.MAX)), + "18446744073709551615", + ) + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt128.MAX)), + "340282366920938463463374607431768211455", + ) + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt256.MAX)), + ( + "115792089237316195423570985008687907853" + "269984665640564039457584007913129639935" + ), + ) + assert_equal( + String(BigUInt.from_unsigned_integral_scalar(UInt.MAX)), + "18446744073709551615", + ) + + +def test_from_integral_scalar_unsigned() raises: + """The general entry point agrees with the unsigned-only one.""" + assert_equal(String(BigUInt.from_integral_scalar(UInt8.MAX)), "255") + assert_equal(String(BigUInt.from_integral_scalar(UInt16.MAX)), "65535") + assert_equal(String(BigUInt.from_integral_scalar(UInt32.MAX)), "4294967295") + assert_equal( + String(BigUInt.from_integral_scalar(UInt64.MAX)), "18446744073709551615" + ) + assert_equal( + String(BigUInt.from_integral_scalar(UInt128.MAX)), + "340282366920938463463374607431768211455", + ) + + +def test_from_integral_scalar_signed() raises: + """Non-negative signed scalars of every width convert correctly.""" + assert_equal(String(BigUInt.from_integral_scalar(Int8(0))), "0") + assert_equal(String(BigUInt.from_integral_scalar(Int8.MAX)), "127") + assert_equal(String(BigUInt.from_integral_scalar(Int16.MAX)), "32767") + assert_equal(String(BigUInt.from_integral_scalar(Int32.MAX)), "2147483647") + assert_equal( + String(BigUInt.from_integral_scalar(Int64.MAX)), "9223372036854775807" + ) + assert_equal( + String(BigUInt.from_integral_scalar(Int128.MAX)), + "170141183460469231731687303715884105727", + ) + assert_equal(String(BigUInt.from_integral_scalar(Int(0))), "0") + assert_equal( + String(BigUInt.from_integral_scalar(Int(1_000_000_000))), "1000000000" + ) + assert_equal( + String(BigUInt.from_integral_scalar(Int.MAX)), "9223372036854775807" + ) + + +def test_from_integral_scalar_negative_raises() raises: + """A negative value of any signed width is rejected.""" + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int8(-1)) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int16(-1)) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int32(-1)) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int64(-1)) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int128(-1)) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int(-1)) + # The most negative value of a width is the case a naive negation would + # get wrong, so check it explicitly. + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int8.MIN) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int64.MIN) + with assert_raises(): + _ = BigUInt.from_integral_scalar(Int.MIN) + + +def test_constructor_accepts_all_integral_widths() raises: + """`BigUInt(value)` now accepts signed scalars, not just `Int`.""" + assert_equal(String(BigUInt(UInt8(7))), "7") + assert_equal(String(BigUInt(Int8(7))), "7") + assert_equal(String(BigUInt(UInt32(4_294_967_295))), "4294967295") + assert_equal(String(BigUInt(Int32(2_147_483_647))), "2147483647") + assert_equal(String(BigUInt(UInt64.MAX)), "18446744073709551615") + assert_equal(String(BigUInt(Int64.MAX)), "9223372036854775807") + assert_equal(String(BigUInt(Int(12345))), "12345") + with assert_raises(): + _ = BigUInt(Int(-1)) + + +def main() raises: + testing.TestSuite.discover_tests[__functions_in_module()]().run() From 1255decdf8250f973a885ba1d440180d85f23e05 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 12 Aug 2026 21:11:33 +0200 Subject: [PATCH 09/10] Update cli --- pixi.toml | 34 +++++++-------- src/cli/ensure_argmojo.sh | 88 ++++++++++++++++++++++++++++++++++++++ src/cli/limo/terminal.mojo | 21 ++++----- 3 files changed, 115 insertions(+), 28 deletions(-) create mode 100755 src/cli/ensure_argmojo.sh diff --git a/pixi.toml b/pixi.toml index 7bd3e604..850f816b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -9,7 +9,11 @@ readme = "README.md" version = "0.11.0" [dependencies] -# argmojo = ">=0.7,<0.8" # CLI argument parsing for the Decimo calculator +# CLI argument parsing for the Decimo calculator. The modular-community +# channel does not ship 0.8.0 yet; until it does, `pixi run buildcli` +# falls back to the pinned upstream commit (see src/cli/ensure_argmojo.sh). +# Uncomment this line once the package is available: +# argmojo = ">=0.8.0,<0.9.0" mojo = ">=1.0.0,<1.1.0" # Mojo language compiler and runtime python = ">=3.13" # For Python bindings and tests python-build = ">=0.2.0" # Build PyPI wheel (`pixi run wheel`) @@ -89,28 +93,22 @@ dec_debug = """clear && pixi run package && cd benches/decimal128 \ &&pixi run mojo run -I ../ -D ASSERT=all bench.mojo && cd ../.. \ &&pixi run clean""" -# Fetch argmojo source code for CLI calculator -# Only do this when necessary -# (kept for fallback if conda argmojo becomes unavailable for some platform) -# fetch = """git clone https://github.com/forfudan/argmojo.git temp/argmojo 2>/dev/null || true \ -# &&cd temp/argmojo && git fetch --all --tags --prune 2>/dev/null \ -# && git checkout fc06e173e3c335f449df13859560bb40a2d4d872 2>/dev/null""" +# Resolve argmojo for the CLI calculator: use the conda package if the +# environment provides one, otherwise clone + precompile the pinned upstream +# commit (release v0.8.0) into temp/argmojo.mojoc. +# Overrides: DECIMO_ARGMOJO=conda|git, ARGMOJO_COMMIT= +argmojo = "bash src/cli/ensure_argmojo.sh" # cli calculator bcli = "clear && pixi run buildcli" -# argmojo is provided by the conda dependency, so no temp/argmojo build -# step is needed. We still package decimo into temp/ so the CLI build -# (and downstream `testcli`) can use `-I temp`. -buildcli = """mkdir -p temp \ +# `pixi run argmojo` picks the conda package when it is installed and +# otherwise drops temp/argmojo.mojoc from the pinned upstream commit. Either +# way decimo is packaged into temp/ as well, so the CLI build (and downstream +# `testcli`) only needs `-I temp`. +buildcli = """pixi run argmojo \ +&& mkdir -p temp \ && pixi run mojo precompile src/decimo -o temp/decimo.mojoc \ && pixi run mojo build -I temp -I src/cli -o decimo src/cli/main.mojo""" -# Uncomment the following lines if we build the CLI package with a -# local clone of argmojo (e.g. when conda argmojo is unavailable): -# buildcli = """pixi run fetch \ -# && mkdir -p temp \ -# && pixi run mojo precompile src/decimo -o temp/decimo.mojoc \ -# && pixi run mojo precompile temp/argmojo/src/argmojo -o temp/argmojo.mojoc \ -# && pixi run mojo build -I temp -I src/cli -o decimo src/cli/main.mojo""" tcli = "clear && pixi run test cli" testcli = "pixi run buildcli && cp temp/decimo.mojoc tests/ && bash tests/test.sh cli" diff --git a/src/cli/ensure_argmojo.sh b/src/cli/ensure_argmojo.sh new file mode 100755 index 00000000..4aa19075 --- /dev/null +++ b/src/cli/ensure_argmojo.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# ===----------------------------------------------------------------------=== # +# Make the `argmojo` CLI-parsing package available for the Decimo CLI build. +# +# Two sources, tried in order: +# +# 1. The conda package `argmojo` from the modular-community channel +# (uncomment the `argmojo` line in pixi.toml's [dependencies] once the +# channel ships a build matching the pinned version below). If the +# environment already provides argmojo, nothing else is done. +# +# 2. Fallback: the upstream git repository, pinned at $ARGMOJO_COMMIT +# (= release v0.8.0). The sources are cloned into temp/argmojo and +# precompiled to temp/argmojo.mojoc, which the CLI build picks up +# through its `-I temp` include path. +# +# Usage: +# bash src/cli/ensure_argmojo.sh # auto-detect (used by `pixi run buildcli`) +# +# Environment overrides: +# DECIMO_ARGMOJO=conda require the environment-provided package (no git fallback) +# DECIMO_ARGMOJO=git force the pinned git checkout, ignoring any conda package +# ARGMOJO_COMMIT= use a different upstream commit +# ARGMOJO_REPO= use a different upstream repository +# ===----------------------------------------------------------------------=== # + +set -euo pipefail + +ARGMOJO_REPO="${ARGMOJO_REPO:-https://github.com/forfudan/argmojo.git}" +# https://github.com/forfudan/argmojo/releases#release-v0.8.0 +ARGMOJO_COMMIT="${ARGMOJO_COMMIT:-2ba77c1be364e49fe7db88c724dd0f9a25ed3a44}" +MODE="${DECIMO_ARGMOJO:-auto}" + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +cd "$REPO_ROOT" +mkdir -p temp + +CLONE_DIR="temp/argmojo" +PKG="temp/argmojo.mojoc" +STAMP="temp/.argmojo.commit" + +# --- 1. Is argmojo already importable from the environment? ---------------- # +# Compile a two-line probe *without* `-I temp`, so only a package provided by +# the environment (i.e. the conda one) can satisfy the import. +env_has_argmojo() { + local probe="temp/.argmojo_probe.mojo" + printf 'from argmojo import Command\n\nfn main():\n pass\n' >"$probe" + local ok=0 + pixi run mojo build -o temp/.argmojo_probe "$probe" >/dev/null 2>&1 || ok=1 + rm -f "$probe" temp/.argmojo_probe + return $ok +} + +if [[ "$MODE" != "git" ]]; then + if env_has_argmojo; then + # A stale fallback build would shadow the conda package via `-I temp`. + rm -f "$PKG" "$STAMP" + echo "argmojo: using the package provided by the environment (conda)." + exit 0 + fi + if [[ "$MODE" == "conda" ]]; then + echo "argmojo: DECIMO_ARGMOJO=conda, but no argmojo package is installed." >&2 + echo " Add it to pixi.toml [dependencies] or unset DECIMO_ARGMOJO." >&2 + exit 1 + fi +fi + +# --- 2. Fallback: pinned git checkout -------------------------------------- # +if [[ -f "$PKG" && -f "$STAMP" && "$(cat "$STAMP")" == "$ARGMOJO_COMMIT" ]]; then + echo "argmojo: reusing $PKG (commit ${ARGMOJO_COMMIT:0:8})." + exit 0 +fi + +echo "argmojo: not provided by the environment, falling back to" +echo " $ARGMOJO_REPO @ ${ARGMOJO_COMMIT:0:8}" + +if [[ ! -d "$CLONE_DIR/.git" ]]; then + rm -rf "$CLONE_DIR" + git clone --quiet "$ARGMOJO_REPO" "$CLONE_DIR" +fi +if ! git -C "$CLONE_DIR" cat-file -e "$ARGMOJO_COMMIT^{commit}" 2>/dev/null; then + git -C "$CLONE_DIR" fetch --quiet --all --tags --prune +fi +git -C "$CLONE_DIR" checkout --quiet --detach "$ARGMOJO_COMMIT" + +pixi run mojo precompile "$CLONE_DIR/src/argmojo" -o "$PKG" +echo "$ARGMOJO_COMMIT" >"$STAMP" +echo "argmojo: built $PKG from ${ARGMOJO_COMMIT:0:8}." diff --git a/src/cli/limo/terminal.mojo b/src/cli/limo/terminal.mojo index 84fd21b2..ff9a2cd0 100644 --- a/src/cli/limo/terminal.mojo +++ b/src/cli/limo/terminal.mojo @@ -244,12 +244,12 @@ struct TermIOS(Copyable, Movable): # be identical. Using `Int` everywhere (= i64 on 64-bit platforms) is the # common convention adopted by argmojo; limo follows suit. # -# Exemptions: `isatty` and `write` are already declared inside the Mojo -# stdlib with their own signatures (`Int32 -> Int32` for `isatty`, a -# variadic-ish form for `write`); using `Int` for those names produces an -# "existing function with conflicting signature" lowering error. We keep -# the stdlib's declared types for those two symbols and use the `Int` -# convention for every other libc function we call directly. +# Exemptions: `isatty`, `write` and `read` are already declared inside the +# Mojo stdlib with their own signatures (`Int32 -> Int32` for `isatty`, a +# variadic-ish form for `write` and `read`); using `Int` for those names +# produces an "existing function with conflicting signature" lowering error. +# We keep the stdlib's declared types for those three symbols and use the +# `Int` convention for every other libc function we call directly. # # Reference: https://github.com/forfudan/argmojo — see src/argmojo/utils.mojo # for the canonical FFI signatures. @@ -349,12 +349,13 @@ def read_byte() raises -> UInt8: """Reads a single byte from stdin (blocking). Requires raw mode to be active for byte-at-a-time reads. - Uses `read(2)` with the same `[Int, Int, Int, Int]` signature as argmojo - so that the LLVM declarations are identical and cannot conflict. + Uses `read(2)` without explicit argument types, like `write` below: the + Mojo stdlib already declares `read`, so spelling out the argument types + produces a conflicting LLVM declaration. """ var buf = List[UInt8](length=1, fill=0) - var bytes_read = external_call["read", Int, Int, Int, Int]( - Int(STDIN_FILENO), Int(buf.unsafe_ptr()), 1 + var bytes_read = external_call["read", Int]( + Int(STDIN_FILENO), buf.unsafe_ptr(), UInt(1) ) if bytes_read <= 0: raise Error("read failed (EOF)") From 87a073e5d05cf7ccd2ea1eedcbbc851da40f9d8b Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 12 Aug 2026 21:22:09 +0200 Subject: [PATCH 10/10] Minor fix --- pixi.toml | 5 +++-- python/README.md | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pixi.toml b/pixi.toml index 850f816b..7675768e 100644 --- a/pixi.toml +++ b/pixi.toml @@ -57,8 +57,9 @@ package_decimo = """pixi run mojo precompile src/decimo -o decimo.mojoc \ # clean the package files in tests folder c = "clear && pixi run clean" -clean = """rm tests/decimo.mojoc && \ -rm benches/decimo.mojoc""" +# `-f`: `clean` runs first inside `format` (and hence `all`), so it must not +# fail when the artifacts are absent (fresh checkout, or after a previous run). +clean = "rm -f tests/decimo.mojoc benches/decimo.mojoc" # gmp/mpfr wrapper (compile C wrapper — no MPFR needed at build time) bgmp = "clear && pixi run buildgmp" diff --git a/python/README.md b/python/README.md index 43967d0a..e06af761 100644 --- a/python/README.md +++ b/python/README.md @@ -23,9 +23,9 @@ from decimo import Decimal a = Decimal("1.234567890123456789012345678901234567890") b = Decimal("9.876543210987654321098765432109876543210") -print(a + b) # 11.111111101111111110111111111111111111100 -print(a * b) # 12.193263111263526900... -print(a / b) # 0.12499999... +print(a + b) # 11.111111101111111110111111111111111111100 +print(a * b) # 12.193263111263526900... +print(a / b) # 0.12499999... ``` ## Status