From 2a3d363f61c8137f1e14d2f4ec57a85359909bed Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Tue, 12 May 2026 20:22:16 +0800 Subject: [PATCH 01/10] Mojo v1.0.0b1 --- benches/bigdecimal/mojo/bench.mojo | 24 +++--- pixi.lock | 106 ++++++++++--------------- pixi.toml | 15 ++-- src/cli/calculator/display.mojo | 8 +- src/cli/calculator/engine.mojo | 8 +- src/cli/calculator/io.mojo | 16 ++-- src/cli/limo/line_editor.mojo | 2 +- src/cli/main.mojo | 11 +-- src/decimo/bigdecimal/arithmetics.mojo | 2 + src/decimo/bigdecimal/bigdecimal.mojo | 43 ++++++---- src/decimo/bigdecimal/constants.mojo | 1 + src/decimo/bigdecimal/exponential.mojo | 62 +++++++++------ src/decimo/bigint/arithmetics.mojo | 28 +++---- src/decimo/bigint/bigint.mojo | 47 ++++++----- src/decimo/bigint/bitwise.mojo | 22 ++--- src/decimo/bigint/exponential.mojo | 4 +- src/decimo/bigint10/arithmetics.mojo | 1 + src/decimo/bigint10/bigint10.mojo | 17 ++-- src/decimo/biguint/arithmetics.mojo | 93 ++++++++++------------ src/decimo/biguint/biguint.mojo | 21 ++--- src/decimo/biguint/comparison.mojo | 4 +- src/decimo/decimal128/decimal128.mojo | 18 ++--- src/decimo/errors.mojo | 4 +- src/decimo/str.mojo | 13 ++- src/decimo/tests.mojo | 4 +- src/decimo/toml/parser.mojo | 8 +- src/decimo/toml/tokenizer.mojo | 12 +-- 27 files changed, 300 insertions(+), 294 deletions(-) diff --git a/benches/bigdecimal/mojo/bench.mojo b/benches/bigdecimal/mojo/bench.mojo index d4c0e86a..2f7fec18 100644 --- a/benches/bigdecimal/mojo/bench.mojo +++ b/benches/bigdecimal/mojo/bench.mojo @@ -34,13 +34,13 @@ from std.sys import argv as sys_argv from std.time import perf_counter_ns -fn _now_stamp() raises -> String: +def _now_stamp() raises -> String: var dt = Python.import_module("datetime") var now = dt.datetime.now(dt.timezone.utc) return String(now.strftime("%Y%m%d_%H%M%S")) -fn _csv_quote(s: String) -> String: +def _csv_quote(s: String) -> String: var needs = False for ch in s.codepoint_slices(): if ch == "," or ch == '"' or ch == "\n" or ch == "\r": @@ -58,7 +58,7 @@ fn _csv_quote(s: String) -> String: return out -fn _parse_round_param(b: String) raises -> Tuple[Int, RoundingMode]: +def _parse_round_param(b: String) raises -> Tuple[Int, RoundingMode]: """Decode "ndigits|MODE" into (ndigits, RoundingMode).""" var idx = b.find("|") if idx < 0: @@ -82,7 +82,7 @@ fn _parse_round_param(b: String) raises -> Tuple[Int, RoundingMode]: raise Error("unknown rounding mode: " + mode_str) -fn _cmp_3way(read a: BigDecimal, read b: BigDecimal) raises -> String: +def _cmp_3way(read a: BigDecimal, read b: BigDecimal) raises -> String: """Stable, cross-language 3-way comparison: returns "-1", "0", or "1".""" if a < b: return String("-1") @@ -91,7 +91,7 @@ fn _cmp_3way(read a: BigDecimal, read b: BigDecimal) raises -> String: return String("0") -fn _round_to_prec(var v: BigDecimal, precision: Int) raises -> BigDecimal: +def _round_to_prec(var v: BigDecimal, precision: Int) raises -> BigDecimal: """Round `v` to `precision` significant digits (HALF_EVEN), in-place.""" round_to_precision( v, @@ -103,7 +103,7 @@ fn _round_to_prec(var v: BigDecimal, precision: Int) raises -> BigDecimal: return v^ -fn _emit(v: BigDecimal) raises -> String: +def _emit(v: BigDecimal) raises -> String: """Render a BigDecimal in fixed-point (no scientific notation). Works around a corner case in `BigDecimal.to_string(force_plain=True)` @@ -127,7 +127,7 @@ fn _emit(v: BigDecimal) raises -> String: return s^ -fn _result_for( +def _result_for( op: String, read a: BigDecimal, read b: BigDecimal, @@ -171,7 +171,7 @@ fn _result_for( raise Error("unknown op: " + op) -fn _time_kernel( +def _time_kernel( op: String, read a: BigDecimal, read b: BigDecimal, @@ -260,7 +260,7 @@ fn _time_kernel( # precision don't collapse to <1 timer-tick and report 0 ns/iter. # Returns (iters, reps): reps shrinks to 1 for very-slow ops to bound wall # time per case at ~500ms. -fn _tune_iters(initial_ns: UInt, hint_iters: Int) -> Tuple[Int, Int]: +def _tune_iters(initial_ns: UInt, hint_iters: Int) -> Tuple[Int, Int]: comptime TARGET_NS: UInt = 50_000_000 # 50ms per rep target comptime MIN_RES_NS: UInt = 100_000 # 100µs floor for resolution comptime MAX_WALL_NS: UInt = 500_000_000 # 500ms total per case @@ -287,7 +287,7 @@ fn _tune_iters(initial_ns: UInt, hint_iters: Int) -> Tuple[Int, Int]: return Tuple[Int, Int](n, reps) -fn _bench_case( +def _bench_case( op: String, bc: BenchCase, iter_hint: Int, @@ -340,7 +340,7 @@ fn _bench_case( return Tuple[String, Float64](result, Float64(best) / Float64(iters)) -fn _pad(s: String, w: Int) -> String: +def _pad(s: String, w: Int) -> String: if len(s) >= w: return s var out = s @@ -349,7 +349,7 @@ fn _pad(s: String, w: Int) -> String: return out -fn main() raises: +def main() raises: var argv = sys_argv() var op = String("add") var cases_dir = String("../cases") diff --git a/pixi.lock b/pixi.lock index 5843ec35..f8d2e5d7 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12,7 +12,6 @@ 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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://repo.prefix.dev/modular-community/linux-64/argmojo-0.5.0-hb0f4dca_0.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/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda @@ -62,11 +61,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.3.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.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.5-h2d0b736_3.conda @@ -108,7 +107,6 @@ environments: - 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://repo.prefix.dev/modular-community/osx-arm64/argmojo-0.5.0-h60d57d3_0.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/osx-arm64/backports.zstd-1.3.0-py313h48bb75e_0.conda @@ -148,11 +146,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.3.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.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.5-h5e97a16_3.conda @@ -214,22 +212,6 @@ packages: license_family: MIT size: 8191 timestamp: 1744137672556 -- conda: https://repo.prefix.dev/modular-community/linux-64/argmojo-0.5.0-hb0f4dca_0.conda - sha256: c1342a434a1150358ffbf150cb05eee5600f4df1755d81a7386b3c891229d7a8 - md5: bbeb104e87b1eeec44a39eda4d1f22ef - depends: - - mojo-compiler 0.26.2.* - license: Apache-2.0 - size: 2163429 - timestamp: 1775323629145 -- conda: https://repo.prefix.dev/modular-community/osx-arm64/argmojo-0.5.0-h60d57d3_0.conda - sha256: 8a6f43cc045c97ef335dca504cffe0b4b91d199d41f8f8e4deae79a801b4b53d - md5: f0a0c5c25cc6bb8b692176544b9b4000 - depends: - - mojo-compiler 0.26.2.* - license: Apache-2.0 - size: 2161961 - timestamp: 1775323591456 - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 md5: 767d508c1a67e02ae8f50e44cacfadb2 @@ -969,10 +951,10 @@ packages: license_family: MIT size: 64736 timestamp: 1754951288511 -- conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda +- conda: https://conda.modular.com/max/noarch/mblack-26.3.0-release.conda noarch: python - sha256: 3c2fceb89cefca899dcd7c8f26a6202acacb2a073e4cb2ef365514a465d01dcd - md5: dd13667299b9b66b8b314dc8d95b54a3 + sha256: c7c36d5b223862acffaaacdfc6f672ca198a046a66f4a956ca57933123fb93b2 + md5: 63c657fb1780079c3f6cbb7a758a16d2 depends: - python >=3.10 - click >=8.0.0 @@ -982,8 +964,8 @@ packages: - platformdirs >=2 - tomli >=1.1.0 license: LicenseRef-Modular-Proprietary - size: 133798 - timestamp: 1773780198354 + size: 135000 + timestamp: 1777574970629 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -993,53 +975,53 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda - sha256: 4d7047466c13d92b1c8eb19c6d203a8503afbd2b1ad63eb5289a8f4bbf4d2945 - md5: 61318988733a695066b39704f6e08bd2 +- conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b1-release.conda + sha256: a8f36a83ece187307d7d78c152828eac58edb002d515de2bcbe9f5a19388b70c + md5: 11bdf0256d179b89dc00ca4150c6963c depends: - python >=3.10 - - mojo-compiler ==0.26.2.0 - - mblack ==26.2.0 + - mojo-compiler ==1.0.0b1 + - mblack ==26.3.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 89753715 - timestamp: 1773797215278 -- conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda - sha256: e35b8d34564b30189c5a985990466b4283f9e1d897baf23fe9ddbcbc9283459c - md5: 12e4d8397c451b7c8a55ff5a759ce00b + size: 94106548 + timestamp: 1777595784229 +- conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b1-release.conda + sha256: 2980b825e3eedb153f68f74edeaae6a7b819912c3eb6e49f1eed7d25f883e050 + md5: b5f2c6b04a9e2bbe199fef1ea5677014 depends: - python >=3.10 - - mojo-compiler ==0.26.2.0 - - mblack ==26.2.0 + - mojo-compiler ==1.0.0b1 + - mblack ==26.3.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 81534498 - timestamp: 1773797099755 -- conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda - sha256: e53f30d72a65e6b0a67745e6988f978d8f6ecc14531420631c9719eb9c7b9c2b - md5: e3a673daa0ddf3ca6af297daee4ceab5 + size: 83375027 + timestamp: 1777596028766 +- conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b1-release.conda + sha256: 706c7f8e2be740dda8039bf96182b578bfbbd9220ca1a7f762e1f82acc4eb784 + md5: 2fc6038c3837e50bb855bcf7f930c1c9 depends: - - mojo-python ==0.26.2.0 + - mojo-python ==1.0.0b1 license: LicenseRef-Modular-Proprietary - size: 89091679 - timestamp: 1773797216619 -- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda - sha256: e82cb7ce1a756876a233d364d5397adca5ad7e20fff5204c1c7e93aefe4549b5 - md5: 96e3ec50a2ea4abdb9fc4f3f89dc874b + size: 89421276 + timestamp: 1777595833113 +- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b1-release.conda + sha256: 3e0d6e6e814cb39d14d24234eb8f2ac6524379ea0a9c398a54e77598844e96d6 + md5: fe08c02512b02563a0b878eeb32a684b depends: - - mojo-python ==0.26.2.0 + - mojo-python ==1.0.0b1 license: LicenseRef-Modular-Proprietary - size: 67499721 - timestamp: 1773797103208 -- conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda + size: 67503416 + timestamp: 1777596016502 +- conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda noarch: python - sha256: 2d9e350cfe7a0ae5d96dea13c082b09f21aac8ac4caa3e5def6b075930348fa1 - md5: 67a4fc0d47e84d3a91c4f12cc912c7ac + sha256: b0554c7705685c86e8a8063bcd11ed58897a498c8e1e19ef045f5ebba2c8874f + md5: d0ad2f8ba3758f03bfda84d92bb34b67 depends: - python >=3.10 license: LicenseRef-Modular-Proprietary - size: 22936 - timestamp: 1773780198161 + size: 23114 + timestamp: 1777594699418 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda sha256: 449609f0d250607a300754474350a3b61faf45da183d3071e9720e453c765b8a md5: 32f78e9d06e8593bc4bbf1338da06f5f diff --git a/pixi.toml b/pixi.toml index 25b59855..fc37344a 100644 --- a/pixi.toml +++ b/pixi.toml @@ -9,9 +9,8 @@ readme = "README.md" version = "0.10.0" [dependencies] -# argmojo = ">=0.4.0" # CLI argument parsing for the Decimo calculator (TODO: waiting for argmojo 0.4.0 compatible with mojo 0.26.2) -argmojo = ">=0.5.0,<0.6.0" # CLI argument parsing for the Decimo calculator -mojo = ">=0.26.2.0,<0.26.3" # Mojo language compiler and runtime +# argmojo = ">=0.5.0,<0.6.0" # CLI argument parsing for the Decimo calculator +mojo = ">=1.0.0b1,<2" # 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 @@ -78,15 +77,17 @@ dec_debug = """clear && pixi run package && cd benches/decimal128 \ # Only do this when necessary # (argmojo is not compatible with the latest mojo version) fetch = """git clone https://github.com/forfudan/argmojo.git temp/argmojo 2>/dev/null || true \ -&&cd temp/argmojo && git checkout 29b6f54545f850e19d9a9ccfd1185d87f54e92b2 2>/dev/null""" +&&cd temp/argmojo && git fetch --all --tags --prune 2>/dev/null \ +&& git checkout fc06e173e3c335f449df13859560bb40a2d4d872 2>/dev/null""" # cli calculator bcli = "clear && pixi run buildcli" # Uncomment the following lines if we build the CLI package with # local clone of argmojo -# buildcli = """pixi run mojo package temp/argmojo/src/argmojo -o temp/argmojo.mojopkg \ -# && pixi run mojo build -I src -I src/cli -I temp -o decimo src/cli/main.mojo""" -buildcli = """pixi run mojo build -I src -I src/cli -o decimo src/cli/main.mojo""" +buildcli = """pixi run mojo package src/decimo -o temp/decimo.mojopkg \ +&& pixi run mojo package temp/argmojo/src/argmojo -o temp/argmojo.mojopkg \ +&& pixi run mojo build -I temp -I src/cli -o decimo src/cli/main.mojo""" +# buildcli = """pixi run mojo build -I src -I src/cli -o decimo src/cli/main.mojo""" tcli = "clear && pixi run test cli" testcli = "pixi run buildcli && bash tests/test.sh cli" diff --git a/src/cli/calculator/display.mojo b/src/cli/calculator/display.mojo index 427589e9..7863b0f0 100644 --- a/src/cli/calculator/display.mojo +++ b/src/cli/calculator/display.mojo @@ -55,7 +55,9 @@ comptime CYAN = "\x1b[96m" """ANSI escape code for bright cyan.""" comptime WHITE = "\x1b[97m" """ANSI escape code for bright white.""" -comptime ORANGE = "\x1b[33m" # dark yellow — renders as orange on most terminals +comptime ORANGE = ( # dark yellow — renders as orange on most terminals + "\x1b[33m" +) """ANSI escape code for orange (dark yellow).""" # Semantic aliases. @@ -251,6 +253,6 @@ def _write_caret(expr: String, position: Int): # Caret line — spaces + coloured '^'. var caret_col = position if position >= 0 else 0 - if caret_col > len(expr): - caret_col = len(expr) + if caret_col > expr.byte_length(): + caret_col = expr.byte_length() _write_stderr(" " + " " * caret_col + CARET_COLOR + "^" + RESET) diff --git a/src/cli/calculator/engine.mojo b/src/cli/calculator/engine.mojo index ab31c149..70870ebe 100644 --- a/src/cli/calculator/engine.mojo +++ b/src/cli/calculator/engine.mojo @@ -104,9 +104,9 @@ def display_calc_error(error_msg: String, expr: String): comptime PREFIX = "Error at position " if error_msg.startswith(PREFIX): - var after_prefix = len(PREFIX) + var after_prefix = PREFIX.byte_length() var colon_pos = -1 - for i in range(after_prefix, len(error_msg)): + for i in range(after_prefix, error_msg.byte_length()): if error_msg[byte=i] == ":": colon_pos = i break @@ -143,7 +143,7 @@ def pad_to_precision(plain: String, precision: Int) -> String: return plain var dot_pos = -1 - for i in range(len(plain)): + for i in range(plain.byte_length()): if plain[byte=i] == ".": dot_pos = i break @@ -152,7 +152,7 @@ def pad_to_precision(plain: String, precision: Int) -> String: # No decimal point — add one with `precision` zeros return plain + "." + "0" * precision - var frac_len = len(plain) - dot_pos - 1 + var frac_len = plain.byte_length() - dot_pos - 1 if frac_len >= precision: return plain diff --git a/src/cli/calculator/io.mojo b/src/cli/calculator/io.mojo index c05d5c86..9b05fac9 100644 --- a/src/cli/calculator/io.mojo +++ b/src/cli/calculator/io.mojo @@ -136,7 +136,7 @@ def split_into_lines(text: String) -> List[String]: """ var lines = List[String]() var start = 0 - var text_len = len(text) + var text_len = text.byte_length() for i in range(text_len): if text[byte=i] == "\n": @@ -151,9 +151,9 @@ def split_into_lines(text: String) -> List[String]: if start < text_len: var last = String(text[byte=start:text_len]) # Strip trailing \r if present - if len(last) > 0 and last[byte=len(last) - 1] == "\r": - last = String(last[byte = 0 : len(last) - 1]) - if len(last) > 0: + if last.byte_length() > 0 and last[byte=last.byte_length() - 1] == "\r": + last = String(last[byte = 0 : last.byte_length() - 1]) + if last.byte_length() > 0: lines.append(last) return lines^ @@ -181,7 +181,7 @@ def strip_comment(line: String) -> String: strip_comment("sqrt(2)") → `sqrt(2)`. strip_comment("") → `""`. """ - var n = len(line) + var n = line.byte_length() if n == 0: return String("") @@ -210,7 +210,7 @@ def is_blank(line: String) -> Bool: Returns: True if the line is empty or whitespace-only. """ - var n = len(line) + var n = line.byte_length() if n == 0: return True @@ -256,7 +256,7 @@ def strip(s: String) -> String: var bytes = StringSlice(s).as_bytes() var ptr = bytes.unsafe_ptr() var start = 0 - var end = len(s) + var end = s.byte_length() while start < end: var c = ptr[start] @@ -292,7 +292,7 @@ def filter_expression_lines(lines: List[String]) -> List[String]: var result = List[String]() for i in range(len(lines)): var line = strip(strip_comment(lines[i])) - if len(line) > 0: + if line.byte_length() > 0: result.append(line) return result^ diff --git a/src/cli/limo/line_editor.mojo b/src/cli/limo/line_editor.mojo index 717453a3..dbf51fe9 100644 --- a/src/cli/limo/line_editor.mojo +++ b/src/cli/limo/line_editor.mojo @@ -385,7 +385,7 @@ struct LineEditor(Movable): def _add_history(mut self, line: String): """Adds a non-empty line to history, skipping consecutive duplicates.""" - if len(line) == 0: + if line.byte_length() == 0: return # Skip if same as the most recent entry if ( diff --git a/src/cli/main.mojo b/src/cli/main.mojo index 4684541d..e986f3a2 100644 --- a/src/cli/main.mojo +++ b/src/cli/main.mojo @@ -133,10 +133,7 @@ def _run() raises: cmd.mutually_exclusive(["scientific", "engineering"]) # Allow expressions starting with '-' (e.g. "-3*pi*(sin(1))") to be # treated as positional values rather than option flags. - for i in range(len(cmd.args)): - if cmd.args[i].name == "expr": - cmd.args[i]._allow_hyphen_values = True - break + cmd.allow_negative_expressions() cmd.add_tip( 'If your expression contains *, ( or ), quote it: decimo "2 * (3 + 4)"' ) @@ -163,8 +160,8 @@ def _run() raises: # 3. No expr, stdin is piped → pipe mode # 4. No expr, stdin is a TTY → interactive REPL - var has_file = len(args.file.value) > 0 - var has_expr = len(args.expr.value) > 0 + var has_file = args.file.value.byte_length() > 0 + var has_expr = args.expr.value.byte_length() > 0 if has_file and has_expr: # Ambiguous: both --file and a positional expression were given. @@ -234,7 +231,7 @@ def _run_pipe_mode( ) raises: """Read expressions from stdin (one per line) and evaluate each.""" var text = read_stdin() - if len(text) == 0: + if text.byte_length() == 0: return var expressions = filter_expression_lines(split_into_lines(text)) diff --git a/src/decimo/bigdecimal/arithmetics.mojo b/src/decimo/bigdecimal/arithmetics.mojo index 646a9fea..2d483bb7 100644 --- a/src/decimo/bigdecimal/arithmetics.mojo +++ b/src/decimo/bigdecimal/arithmetics.mojo @@ -20,6 +20,8 @@ Implements functions for mathematical operations on BigDecimal objects. from std import math +import decimo.biguint.arithmetics +import decimo.bigdecimal.arithmetics from decimo.bigdecimal.rounding import round_to_precision 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 02e44ec2..5e2b83c7 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -32,6 +32,13 @@ from decimo.rounding_mode import RoundingMode from decimo.bigdecimal.rounding import round_to_precision from decimo.bigint10.bigint10 import BigInt10 import decimo.str +import decimo.bigdecimal.arithmetics +import decimo.bigdecimal.comparison +import decimo.bigdecimal.constants +import decimo.bigdecimal.exponential +import decimo.bigdecimal.rounding +import decimo.bigdecimal.trigonometric +import decimo.biguint.arithmetics # Type aliases for the arbitrary-precision decimal type. # The names BigDecimal, Decimal, and BDec can be used interchangeably. @@ -695,7 +702,7 @@ struct BigDecimal( var result = String("-") if self.sign else String("") var coefficient_string = self.coefficient.to_string() - var num_digits = len(coefficient_string) + var num_digits = coefficient_string.byte_length() # CPython-compatible logic for Decimal.__str__: # @@ -745,11 +752,11 @@ struct BigDecimal( # Zero-pad the right side if fewer sig-digits than lead_digits # e.g. coef="5", lead_digits=3 -> coef="500" (500E-3) - if len(coef) < lead_digits: - coef = coef + "0" * (lead_digits - len(coef)) + if coef.byte_length() < lead_digits: + coef = coef + "0" * (lead_digits - coef.byte_length()) # Build mantissa - if len(coef) <= lead_digits: + if coef.byte_length() <= lead_digits: result += coef else: result += coef[byte=:lead_digits] @@ -784,7 +791,7 @@ struct BigDecimal( trimmed.append(cptr[i]) coef = String(unsafe_from_utf8=trimmed^) result += coef[byte=0] - if len(coef) > 1: + if coef.byte_length() > 1: result += "." result += coef[byte=1:] result += "E" @@ -834,8 +841,10 @@ struct BigDecimal( if line_width > 0: var start = 0 var end = line_width - var lines = List[String](capacity=len(result) // line_width + 1) - while end < len(result): + var lines = List[String]( + capacity=result.byte_length() // line_width + 1 + ) + while end < result.byte_length(): lines.append(String(result[byte=start:end])) start = end end += line_width @@ -2386,10 +2395,10 @@ struct BigDecimal( fixed_labels.append("scale:") var max_label_len = 0 for i in range(len(fixed_labels)): - if len(fixed_labels[i]) > max_label_len: - max_label_len = len(fixed_labels[i]) + if fixed_labels[i].byte_length() > max_label_len: + max_label_len = fixed_labels[i].byte_length() for i in range(len(self.coefficient.words)): - var label_len = len("word :") + len(String(i)) + var label_len = "word :".byte_length() + String(i).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -2404,7 +2413,7 @@ struct BigDecimal( var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - len("number:")) + result += "number:" + String(" ") * (col - "number:".byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -2415,24 +2424,24 @@ struct BigDecimal( line_width=value_width ).split("\n") var coeff_label = String("coefficient:") - result += coeff_label + String(" ") * (col - len(coeff_label)) + result += coeff_label + String(" ") * (col - coeff_label.byte_length()) for i in range(len(string_of_coefficient)): if i > 0: result += String(" ") * col result += string_of_coefficient[i] + "\n" # negative line - result += "negative:" + String(" ") * (col - len("negative:")) + result += "negative:" + String(" ") * (col - "negative:".byte_length()) result += String(self.sign) + "\n" # scale line - result += "scale:" + String(" ") * (col - len("scale:")) + result += "scale:" + String(" ") * (col - "scale:".byte_length()) result += String(self.scale) + "\n" # word lines for i in range(len(self.coefficient.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - len(label)) + result += label + String(" ") * (col - label.byte_length()) result += ( decimo.str.rjust( String(self.coefficient.words[i]), 9, fillchar="0" @@ -2700,7 +2709,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: frac_part = String(s[byte = dot_pos + 1 : e_pos]) # --- Group integer part (right-to-left every 3 digits) --- - var int_len = len(int_part) + var int_len = (int_part).byte_length() if int_len > 3: var blocks = List[String](capacity=int_len // 3 + 1) var end_i = int_len @@ -2714,7 +2723,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: int_part = delimiter.join(blocks) # --- Group fractional part (left-to-right every 3 digits) --- - var frac_len = len(frac_part) + var frac_len = frac_part.byte_length() if frac_len > 3: var blocks = List[String](capacity=frac_len // 3 + 1) var i = 0 diff --git a/src/decimo/bigdecimal/constants.mojo b/src/decimo/bigdecimal/constants.mojo index efd2d4a4..34f91935 100644 --- a/src/decimo/bigdecimal/constants.mojo +++ b/src/decimo/bigdecimal/constants.mojo @@ -21,6 +21,7 @@ from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.errors import ValueError from decimo.bigint10.bigint10 import BigInt10 from decimo.rounding_mode import RoundingMode +import decimo.bigdecimal.trigonometric comptime PI_1024 = BigDecimal( coefficient=BigUInt( diff --git a/src/decimo/bigdecimal/exponential.mojo b/src/decimo/bigdecimal/exponential.mojo index 56020383..c95c22da 100644 --- a/src/decimo/bigdecimal/exponential.mojo +++ b/src/decimo/bigdecimal/exponential.mojo @@ -18,6 +18,10 @@ from std import math +import decimo.bigdecimal.arithmetics +import decimo.biguint.arithmetics +import decimo.biguint.exponential +import decimo.decimal128.utility from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.errors import ValueError, OverflowError, ZeroDivisionError from decimo.rounding_mode import RoundingMode @@ -649,9 +653,11 @@ def integer_root( var x_exp = abs_x.adjusted() # floor(log10(x)) # Extract leading digits for a more precise Float64 approximation - var top_word = Float64(abs_x.coefficient.words[-1]) + var top_word = Float64( + abs_x.coefficient.words[len(abs_x.coefficient.words) - 1] + ) var digits_in_top = 0 - var temp_val = abs_x.coefficient.words[-1] + var temp_val = abs_x.coefficient.words[len(abs_x.coefficient.words) - 1] while temp_val > 0: temp_val //= 10 digits_in_top += 1 @@ -661,9 +667,9 @@ def integer_root( # Normalize: get a value in [1, 10) * 10^x_exp var mantissa = top_word / Float64(10.0) ** Float64(digits_in_top - 1) if len(abs_x.coefficient.words) > 1: - mantissa += Float64(abs_x.coefficient.words[-2]) / ( - Float64(10.0) ** Float64(digits_in_top - 1) * 1e9 - ) + mantissa += Float64( + abs_x.coefficient.words[len(abs_x.coefficient.words) - 2] + ) / (Float64(10.0) ** Float64(digits_in_top - 1) * 1e9) var x_f64 = mantissa * Float64(10.0) ** Float64(x_exp) var guess_f64 = x_f64 ** (1.0 / Float64(n_int)) @@ -1057,9 +1063,11 @@ def fast_isqrt(c: BigUInt, working_digits: Int) raises -> BigUInt: c_norm.scale += norm_shift # --- Float64 initial guess for 1/sqrt(c_norm) --- - var top_word = Float64(c_norm.coefficient.words[-1]) + var top_word = Float64( + c_norm.coefficient.words[len(c_norm.coefficient.words) - 1] + ) var digits_in_top: Int = 0 - var temp_val = c_norm.coefficient.words[-1] + var temp_val = c_norm.coefficient.words[len(c_norm.coefficient.words) - 1] while temp_val > 0: temp_val //= 10 digits_in_top += 1 @@ -1068,9 +1076,9 @@ def fast_isqrt(c: BigUInt, working_digits: Int) raises -> BigUInt: var mantissa = top_word / Float64(10.0) ** Float64(digits_in_top - 1) if len(c_norm.coefficient.words) > 1: - mantissa += Float64(c_norm.coefficient.words[-2]) / ( - Float64(10.0) ** Float64(digits_in_top + 8) - ) + mantissa += Float64( + c_norm.coefficient.words[len(c_norm.coefficient.words) - 2] + ) / (Float64(10.0) ** Float64(digits_in_top + 8)) var c_norm_exp = c_norm.adjusted() var c_norm_f64 = mantissa * Float64(10.0) ** Float64(c_norm_exp) @@ -1373,9 +1381,11 @@ def sqrt_reciprocal(x: BigDecimal, precision: Int) raises -> BigDecimal: x_norm.scale += shift # x_norm = x * 10^(-shift) # --- Float64 initial guess for 1/sqrt(x_norm) --- - var top_word = Float64(x_norm.coefficient.words[-1]) + var top_word = Float64( + x_norm.coefficient.words[len(x_norm.coefficient.words) - 1] + ) var digits_in_top: Int = 0 - var temp_val = x_norm.coefficient.words[-1] + var temp_val = x_norm.coefficient.words[len(x_norm.coefficient.words) - 1] while temp_val > 0: temp_val //= 10 digits_in_top += 1 @@ -1384,9 +1394,9 @@ def sqrt_reciprocal(x: BigDecimal, precision: Int) raises -> BigDecimal: var mantissa = top_word / Float64(10.0) ** Float64(digits_in_top - 1) if len(x_norm.coefficient.words) > 1: - mantissa += Float64(x_norm.coefficient.words[-2]) / ( - Float64(10.0) ** Float64(digits_in_top + 8) - ) + mantissa += Float64( + x_norm.coefficient.words[len(x_norm.coefficient.words) - 2] + ) / (Float64(10.0) ** Float64(digits_in_top + 8)) var x_norm_exp = x_norm.adjusted() var x_norm_f64 = mantissa * Float64(10.0) ** Float64(x_norm_exp) @@ -1657,17 +1667,21 @@ def sqrt_decimal_approach(x: BigDecimal, precision: Int) raises -> BigDecimal: ) elif ndigits_coef <= 18: value = ( - UInt128(x.coefficient.words[-1]) + UInt128(x.coefficient.words[len(x.coefficient.words) - 1]) * UInt128(1_000_000_000_000_000_000) - ) + (UInt128(x.coefficient.words[-2]) * UInt128(1_000_000_000)) + ) + ( + UInt128(x.coefficient.words[len(x.coefficient.words) - 2]) + * UInt128(1_000_000_000) + ) else: # ndigits_coef > 18 value = ( ( - UInt128(x.coefficient.words[-1]) + UInt128(x.coefficient.words[len(x.coefficient.words) - 1]) * UInt128(1_000_000_000_000_000_000) ) - + UInt128(x.coefficient.words[-2]) * UInt128(1_000_000_000) - + UInt128(x.coefficient.words[-3]) + + UInt128(x.coefficient.words[len(x.coefficient.words) - 2]) + * UInt128(1_000_000_000) + + UInt128(x.coefficient.words[len(x.coefficient.words) - 3]) ) if odd_ndigits_frac_part: value = value * UInt128(10) @@ -2121,7 +2135,7 @@ def log(x: BigDecimal, base: BigDecimal, precision: Int) raises -> BigDecimal: raise ValueError(message="Cannot use zero as a base", function="log()") if ( base.coefficient.number_of_digits() == base.scale + 1 - and base.coefficient.words[-1] == 1 + and base.coefficient.words[len(base.coefficient.words) - 1] == 1 ): raise ValueError( message="Cannot use base 1 for logarithm", function="log()" @@ -2130,7 +2144,7 @@ def log(x: BigDecimal, base: BigDecimal, precision: Int) raises -> BigDecimal: # Special cases if ( x.coefficient.number_of_digits() == x.scale + 1 - and x.coefficient.words[-1] == 1 + and x.coefficient.words[len(x.coefficient.words) - 1] == 1 ): return BigDecimal(BigUInt.zero(), 0, False) # log_base(1) = 0 @@ -2141,7 +2155,7 @@ def log(x: BigDecimal, base: BigDecimal, precision: Int) raises -> BigDecimal: if ( base.scale == 0 and base.coefficient.number_of_digits() == 2 - and base.coefficient.words[-1] == 10 + and base.coefficient.words[len(base.coefficient.words) - 1] == 10 ): return log10(x, precision) @@ -2191,7 +2205,7 @@ def log10(x: BigDecimal, precision: Int) raises -> BigDecimal: # Special case for x = 1 if ( x.coefficient.number_of_digits() == x.scale + 1 - and x.coefficient.words[-1] == 1 + and x.coefficient.words[len(x.coefficient.words) - 1] == 1 ): return BigDecimal(BigUInt.zero(), 0, False) # log10(1) = 0 diff --git a/src/decimo/bigint/arithmetics.mojo b/src/decimo/bigint/arithmetics.mojo index fd34dbc2..8ec5fe7e 100644 --- a/src/decimo/bigint/arithmetics.mojo +++ b/src/decimo/bigint/arithmetics.mojo @@ -162,7 +162,7 @@ def _subtract_magnitudes(a: List[UInt32], b: List[UInt32]) -> List[UInt32]: result.append(UInt32(diff & 0xFFFF_FFFF)) # Strip leading zeros - while len(result) > 1 and result[-1] == 0: + while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) return result^ @@ -681,7 +681,7 @@ def _divmod_single_word( remainder = temp % divisor # Strip leading zeros from quotient - while len(quotient) > 1 and quotient[-1] == 0: + while len(quotient) > 1 and quotient[len(quotient) - 1] == 0: quotient.shrink(len(quotient) - 1) return (quotient^, UInt32(remainder)) @@ -831,7 +831,7 @@ def _divmod_magnitudes( quotient[j] = UInt32(q_hat) # Strip leading zeros from quotient - while len(quotient) > 1 and quotient[-1] == 0: + while len(quotient) > 1 and quotient[len(quotient) - 1] == 0: quotient.shrink(len(quotient) - 1) # Step D8: Unnormalize remainder by shifting right @@ -938,7 +938,7 @@ def _shift_right_words( var copy = List[UInt32](capacity=num_words) for i in range(min(num_words, len(a))): copy.append(a[i]) - while len(copy) > 1 and copy[-1] == 0: + while len(copy) > 1 and copy[len(copy) - 1] == 0: copy.shrink(len(copy) - 1) if len(copy) == 0: copy.append(UInt32(0)) @@ -956,7 +956,7 @@ def _shift_right_words( result.append(UInt32(lo | hi)) # Strip leading zeros - while len(result) > 1 and result[-1] == 0: + while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) if len(result) == 0: result.append(UInt32(0)) @@ -995,7 +995,7 @@ def _get_words_slice(a: List[UInt32], start: Int, end: Int) -> List[UInt32]: result.resize(unsafe_uninit_length=len_slice) memcpy(dest=result._data, src=a._data + start, count=len_slice) # Strip leading zeros - while len(result) > 1 and result[-1] == 0: + while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) return result^ @@ -1269,9 +1269,9 @@ def _divmod_knuth_d_from_slices( while len(u) > n: u.shrink(len(u) - 1) # Strip leading zeros - while len(quotient) > 1 and quotient[-1] == 0: + while len(quotient) > 1 and quotient[len(quotient) - 1] == 0: quotient.shrink(len(quotient) - 1) - while len(u) > 1 and u[-1] == 0: + while len(u) > 1 and u[len(u) - 1] == 0: u.shrink(len(u) - 1) return (quotient^, u^) @@ -1396,9 +1396,9 @@ def _divmod_burnikel_ziegler( remainder = _shift_right_words(z, bit_shift, len(z)) # Normalize results - while len(quotient) > 1 and quotient[-1] == 0: + while len(quotient) > 1 and quotient[len(quotient) - 1] == 0: quotient.shrink(len(quotient) - 1) - while len(remainder) > 1 and remainder[-1] == 0: + while len(remainder) > 1 and remainder[len(remainder) - 1] == 0: remainder.shrink(len(remainder) - 1) return (quotient^, remainder^) @@ -1545,9 +1545,9 @@ def _bz_three_by_two_slices( _subtract_magnitudes_inplace(c, d) # Strip leading zeros - while len(q) > 1 and q[-1] == 0: + while len(q) > 1 and q[len(q) - 1] == 0: q.shrink(len(q) - 1) - while len(c) > 1 and c[-1] == 0: + while len(c) > 1 and c[len(c) - 1] == 0: c.shrink(len(c) - 1) return (q^, c^) @@ -2000,7 +2000,7 @@ def right_shift_inplace(mut x: BigInt, shift: Int): x.words.shrink(new_len) # Strip leading zeros - while len(x.words) > 1 and x.words[-1] == 0: + while len(x.words) > 1 and x.words[len(x.words) - 1] == 0: x.words.shrink(len(x.words) - 1) if len(x.words) == 0: @@ -2491,7 +2491,7 @@ def right_shift(x: BigInt, shift: Int) -> BigInt: result.append(UInt32(lo | hi)) # Strip leading zeros - while len(result) > 1 and result[-1] == 0: + while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) if len(result) == 0: diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 8254998a..86b91249 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -562,7 +562,7 @@ struct BigInt( remainder = temp & 0xFFFF_FFFF # Remove leading zeros from dividend - while len(div_words) > 1 and div_words[-1] == 0: + while len(div_words) > 1 and div_words[len(div_words) - 1] == 0: div_words.shrink(len(div_words) - 1) result.words.append(UInt32(remainder)) @@ -692,7 +692,10 @@ struct BigInt( remainder = temp % BigUInt.BASE # Remove leading zeros from dividend - while len(dividend.words) > 1 and dividend.words[-1] == 0: + while ( + len(dividend.words) > 1 + and dividend.words[len(dividend.words) - 1] == 0 + ): dividend.words.shrink(len(dividend.words) - 1) decimal_words.append(UInt32(remainder)) @@ -742,8 +745,10 @@ struct BigInt( if line_width > 0: var start = 0 var end = line_width - var lines = List[String](capacity=len(result) // line_width + 1) - while end < len(result): + var lines = List[String]( + capacity=result.byte_length() // line_width + 1 + ) + while end < result.byte_length(): lines.append(String(result[byte=start:end])) start = end end += line_width @@ -781,9 +786,9 @@ struct BigInt( start_idx = 1 # Skip the minus sign var digits_part = String(result[byte=start_idx:]) - var end = len(digits_part) + var end = (digits_part).byte_length() var start = end - 3 - var blocks = List[String](capacity=len(digits_part) // 3 + 1) + var blocks = List[String](capacity=(digits_part).byte_length() // 3 + 1) while start > 0: blocks.append(String(digits_part[byte=start:end])) end = start @@ -819,7 +824,7 @@ struct BigInt( first_word = False else: var h = hex(word)[byte=2:] - for _ in range(8 - len(h)): + for _ in range(8 - (h).byte_length()): result += "0" result += h @@ -851,7 +856,7 @@ struct BigInt( first_word = False else: var b = bin(word)[byte=2:] - for _ in range(32 - len(b)): + for _ in range(32 - (b).byte_length()): result += "0" result += b @@ -1912,7 +1917,7 @@ struct BigInt( def _normalize(mut self): """Strips leading zero words and normalizes -0 to +0.""" - while len(self.words) > 1 and self.words[-1] == 0: + while len(self.words) > 1 and self.words[len(self.words) - 1] == 0: self.words.shrink(len(self.words) - 1) # Normalize -0 to +0 @@ -1932,11 +1937,11 @@ struct BigInt( fixed_labels.append("sign:") var max_label_len = 0 for i in range(len(fixed_labels)): - if len(fixed_labels[i]) > max_label_len: - max_label_len = len(fixed_labels[i]) + if (fixed_labels[i]).byte_length() > max_label_len: + max_label_len = (fixed_labels[i]).byte_length() # Check word labels for i in range(len(self.words)): - var label_len = len("word :") + len(String(i)) + var label_len = ("word :").byte_length() + (String(i)).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -1951,7 +1956,7 @@ struct BigInt( var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - len("number:")) + result += "number:" + String(" ") * (col - ("number:").byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -1960,10 +1965,10 @@ struct BigInt( # number (hex) line var hex_str = self.to_hex_string() var hex_label = String("number (hex):") - result += hex_label + String(" ") * (col - len(hex_label)) + result += hex_label + String(" ") * (col - (hex_label).byte_length()) var hex_start = 0 var first_hex_line = True - while hex_start + value_width < len(hex_str): + while hex_start + value_width < (hex_str).byte_length(): if not first_hex_line: result += String(" ") * col result += ( @@ -1977,13 +1982,13 @@ struct BigInt( result += String(hex_str[byte=hex_start:]) + "\n" # sign line - result += "sign:" + String(" ") * (col - len("sign:")) + result += "sign:" + String(" ") * (col - ("sign:").byte_length()) result += String("negative" if self.sign else "non-negative") + "\n" # word lines for i in range(len(self.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - len(label)) + result += label + String(" ") * (col - (label).byte_length()) result += "0x" + decimo.str.rjust( String(hex(self.words[i])[byte=2:]), 8, fillchar="0" ) @@ -2567,20 +2572,20 @@ def _dc_to_str_recursive( # Zero-pad low_str to exactly low_width digits. # Build the result in a pre-allocated byte buffer to avoid O(n) concatenations. - var padding = low_width - len(low_str) + var padding = low_width - (low_str).byte_length() if padding <= 0: return high_str + low_str - var total_len = len(high_str) + padding + len(low_str) + var total_len = (high_str).byte_length() + padding + (low_str).byte_length() var buf = List[UInt8](capacity=total_len) # Copy high_str bytes - for i in range(len(high_str)): + for i in range((high_str).byte_length()): buf.append(high_str.unsafe_ptr()[i]) # Write zero padding for _ in range(padding): buf.append(48) # ASCII '0' # Copy low_str bytes - for i in range(len(low_str)): + for i in range((low_str).byte_length()): buf.append(low_str.unsafe_ptr()[i]) return String(unsafe_from_utf8=buf^) diff --git a/src/decimo/bigint/bitwise.mojo b/src/decimo/bigint/bitwise.mojo index ee8b0225..984772c9 100644 --- a/src/decimo/bigint/bitwise.mojo +++ b/src/decimo/bigint/bitwise.mojo @@ -70,7 +70,7 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: var result_words = List[UInt32](capacity=min_len) for i in range(min_len): result_words.append(a.words[i] & b.words[i]) - while len(result_words) > 1 and result_words[-1] == 0: + while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: result_words.shrink(len(result_words) - 1) return BigInt(raw_words=result_words^, sign=False) elif op == "or": @@ -80,7 +80,7 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: var wa = UInt32(0) if i >= len(a.words) else a.words[i] var wb = UInt32(0) if i >= len(b.words) else b.words[i] result_words.append(wa | wb) - while len(result_words) > 1 and result_words[-1] == 0: + while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: result_words.shrink(len(result_words) - 1) return BigInt(raw_words=result_words^, sign=False) else: # xor @@ -90,7 +90,7 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: var wa = UInt32(0) if i >= len(a.words) else a.words[i] var wb = UInt32(0) if i >= len(b.words) else b.words[i] result_words.append(wa ^ wb) - while len(result_words) > 1 and result_words[-1] == 0: + while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: result_words.shrink(len(result_words) - 1) return BigInt(raw_words=result_words^, sign=False) @@ -142,7 +142,7 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: # Convert result back from two's complement if negative if not result_negative: # Non-negative: result_tc is the magnitude - while len(result_tc) > 1 and result_tc[-1] == 0: + while len(result_tc) > 1 and result_tc[len(result_tc) - 1] == 0: result_tc.shrink(len(result_tc) - 1) if len(result_tc) == 1 and result_tc[0] == 0: return BigInt() @@ -163,7 +163,7 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: if carry > 0: mag.append(UInt32(carry)) # Strip leading zeros - while len(mag) > 1 and mag[-1] == 0: + while len(mag) > 1 and mag[len(mag) - 1] == 0: mag.shrink(len(mag) - 1) if len(mag) == 1 and mag[0] == 0: return BigInt() @@ -216,7 +216,7 @@ def _binary_bitwise_op_inplace[ if len(a.words) > min_len: a.words.shrink(min_len) # Strip leading zeros - while len(a.words) > 1 and a.words[-1] == 0: + while len(a.words) > 1 and a.words[len(a.words) - 1] == 0: a.words.shrink(len(a.words) - 1) return elif op == "or": @@ -227,7 +227,7 @@ def _binary_bitwise_op_inplace[ for i in range(b_len): a.words[i] = a.words[i] | b.words[i] # Words beyond b_len remain as-is (OR with 0) - while len(a.words) > 1 and a.words[-1] == 0: + while len(a.words) > 1 and a.words[len(a.words) - 1] == 0: a.words.shrink(len(a.words) - 1) return else: # xor @@ -237,7 +237,7 @@ def _binary_bitwise_op_inplace[ for i in range(b_len): a.words[i] = a.words[i] ^ b.words[i] # Words beyond b_len remain as-is (XOR with 0) - while len(a.words) > 1 and a.words[-1] == 0: + while len(a.words) > 1 and a.words[len(a.words) - 1] == 0: a.words.shrink(len(a.words) - 1) return @@ -287,7 +287,7 @@ def _binary_bitwise_op_inplace[ # Convert result back from two's complement if negative if not result_negative: - while len(result_tc) > 1 and result_tc[-1] == 0: + while len(result_tc) > 1 and result_tc[len(result_tc) - 1] == 0: result_tc.shrink(len(result_tc) - 1) if len(result_tc) == 1 and result_tc[0] == 0: a.words.clear() @@ -310,7 +310,7 @@ def _binary_bitwise_op_inplace[ break if carry > 0: mag.append(UInt32(carry)) - while len(mag) > 1 and mag[-1] == 0: + while len(mag) > 1 and mag[len(mag) - 1] == 0: mag.shrink(len(mag) - 1) if len(mag) == 1 and mag[0] == 0: a.words.clear() @@ -401,7 +401,7 @@ def bitwise_not(x: BigInt) -> BigInt: result_words.append(UInt32(diff & 0xFFFF_FFFF)) borrow = (diff >> 63) & 1 # Strip leading zeros - while len(result_words) > 1 and result_words[-1] == 0: + while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: result_words.shrink(len(result_words) - 1) if len(result_words) == 1 and result_words[0] == 0: return BigInt() diff --git a/src/decimo/bigint/exponential.mojo b/src/decimo/bigint/exponential.mojo index c2e92b15..7ac669a1 100644 --- a/src/decimo/bigint/exponential.mojo +++ b/src/decimo/bigint/exponential.mojo @@ -238,7 +238,7 @@ def _right_shift_magnitude_bits(a: List[UInt32], shift: Int) -> List[UInt32]: result.append(UInt32(lo | hi)) # Strip leading zeros - while len(result) > 1 and result[-1] == 0: + while len(result) > 1 and result[len(result) - 1] == 0: result.shrink(len(result) - 1) if len(result) == 0: result.append(UInt32(0)) @@ -477,7 +477,7 @@ def _sqrt_precision_doubling_fast(x: BigInt) raises -> BigInt: a_words[i] = UInt32(0xFFFF_FFFF) borrow = 1 # Strip leading zeros - while len(a_words) > 1 and a_words[-1] == 0: + while len(a_words) > 1 and a_words[len(a_words) - 1] == 0: a_words.shrink(len(a_words) - 1) return BigInt(raw_words=a_words^, sign=False) diff --git a/src/decimo/bigint10/arithmetics.mojo b/src/decimo/bigint10/arithmetics.mojo index b2093191..4248a212 100644 --- a/src/decimo/bigint10/arithmetics.mojo +++ b/src/decimo/bigint10/arithmetics.mojo @@ -22,6 +22,7 @@ from decimo.bigint10.bigint10 import BigInt10 from decimo.biguint.biguint import BigUInt from decimo.errors import ZeroDivisionError from decimo.rounding_mode import RoundingMode +import decimo.biguint.arithmetics def add(x1: BigInt10, x2: BigInt10) -> BigInt10: diff --git a/src/decimo/bigint10/bigint10.mojo b/src/decimo/bigint10/bigint10.mojo index 4e55fda4..74221bdf 100644 --- a/src/decimo/bigint10/bigint10.mojo +++ b/src/decimo/bigint10/bigint10.mojo @@ -28,6 +28,7 @@ from std.python import PythonObject import decimo.bigint10.arithmetics import decimo.bigint10.comparison +import decimo.biguint.arithmetics from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.biguint.biguint import BigUInt from decimo.errors import ( @@ -533,8 +534,8 @@ struct BigInt10( if line_width > 0: var start = 0 var end = line_width - var lines = List[String](capacity=len(result) // line_width + 1) - while end < len(result): + var lines = List[String](capacity=(result).byte_length() // line_width + 1) + while end < (result).byte_length(): lines.append(String(result[byte=start:end])) start = end end += line_width @@ -554,9 +555,9 @@ struct BigInt10( """ var result = self.to_string() - var end = len(result) + var end = (result).byte_length() var start = end - 3 - var blocks = List[String](capacity=len(result) // 3 + 1) + var blocks = List[String](capacity=(result).byte_length() // 3 + 1) while start > 0: blocks.append(String(result[byte=start:end])) end = start @@ -1178,9 +1179,9 @@ struct BigInt10( A formatted string showing the internal representation. """ # Collect all labels to find max width - var max_label_len = len("number:") + var max_label_len = ("number:").byte_length() for i in range(len(self.magnitude.words)): - var label_len = len("word :") + len(String(i)) + var label_len = ("word :").byte_length() + (String(i)).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -1195,7 +1196,7 @@ struct BigInt10( var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - len("number:")) + result += "number:" + String(" ") * (col - ("number:").byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -1204,7 +1205,7 @@ struct BigInt10( # word lines for i in range(len(self.magnitude.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - len(label)) + result += label + String(" ") * (col - (label).byte_length()) result += ( decimo.str.rjust( String(self.magnitude.words[i]), 9, fillchar="0" diff --git a/src/decimo/biguint/arithmetics.mojo b/src/decimo/biguint/arithmetics.mojo index b09f7f63..b68fe72e 100644 --- a/src/decimo/biguint/arithmetics.mojo +++ b/src/decimo/biguint/arithmetics.mojo @@ -23,6 +23,7 @@ from std import math from std.memory import memcpy, memset_zero from decimo.biguint.biguint import BigUInt +import decimo.biguint.arithmetics import decimo.biguint.comparison from decimo.errors import ( OverflowError, @@ -298,12 +299,9 @@ def add_slices_simd( unsafe_uninit_length=max(n_words_x_slice, n_words_y_slice) ) - @parameter def vector_add[ simd_width: Int - ](i: Int) unified { - mut result, read x, read y, read bounds_x, read bounds_y - }: + ](i: Int) {mut result, read x, read y, read bounds_x, read bounds_y}: result.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i + bounds_x[0]) @@ -330,10 +328,9 @@ def add_slices_simd( n_words_shorter_slice = n_words_x_slice longer_start = bounds_y[0] - @parameter def vector_copy_rest_from_longer[ simd_width: Int - ](i: Int) unified { + ](i: Int) { mut result, read longer, read n_words_shorter_slice, read longer_start }: result.words.unsafe_ptr().store[width=simd_width]( @@ -386,8 +383,7 @@ def add_inplace(mut x: BigUInt, y: BigUInt) -> None: if len(x.words) < len(y.words): x.words.resize(new_size=len(y.words), value=UInt32(0)) - @parameter - def vector_add[simd_width: Int](i: Int) unified {mut x, read y}: + def vector_add[simd_width: Int](i: Int) {mut x, read y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -437,10 +433,7 @@ def add_by_slice_inplace( if len(x.words) < n_words_y_slice: x.words.resize(new_size=n_words_y_slice, value=UInt32(0)) - @parameter - def vector_add[ - simd_width: Int - ](i: Int) unified {mut x, read y, read bounds_y}: + def vector_add[simd_width: Int](i: Int) {mut x, read y, read bounds_y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -647,10 +640,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. - @parameter - def vector_subtract[ - simd_width: Int - ](i: Int) unified {mut result, read x, read y}: + def vector_subtract[simd_width: Int](i: Int) {mut result, read x, read y}: result.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -659,10 +649,7 @@ def subtract_simd(x: BigUInt, y: BigUInt) raises -> BigUInt: vectorize[BigUInt.VECTOR_WIDTH](len(y.words), vector_subtract) - @parameter - def vector_copy_rest[ - simd_width: Int - ](i: Int) unified {mut result, read x, read y}: + def vector_copy_rest[simd_width: Int](i: Int) {mut result, read x, read 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), @@ -719,8 +706,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. - @parameter - def vector_subtract[simd_width: Int](i: Int) unified {mut x, read y}: + def vector_subtract[simd_width: Int](i: Int) {mut x, read y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -760,8 +746,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 - @parameter - def vector_subtract[simd_width: Int](i: Int) unified {mut x, read y}: + def vector_subtract[simd_width: Int](i: Int) {mut x, read y}: x.words.unsafe_ptr().store[width=simd_width]( i, x.words.unsafe_ptr().load[width=simd_width](i) @@ -1591,8 +1576,7 @@ def multiply_by_uint32_le_4_inplace(mut x: BigUInt, y: UInt32): return # y is 2, we can just shift the digits of each word to the left by 1 - @parameter - def vector_multiply_by_2[simd_width: Int](i: Int) unified {mut x}: + 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 @@ -1604,8 +1588,7 @@ def multiply_by_uint32_le_4_inplace(mut x: BigUInt, y: UInt32): return # y is 3, we can just multiply the digits of each word by 3 - @parameter - def vector_multiply_by_3[simd_width: Int](i: Int) unified {mut x}: + 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 @@ -1617,8 +1600,7 @@ def multiply_by_uint32_le_4_inplace(mut x: BigUInt, y: UInt32): return # y is 4, we can just shift the digits of each word to the left by 2 - @parameter - def vector_multiply_by_4[simd_width: Int](i: Int) unified {mut x}: + 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 @@ -1960,13 +1942,13 @@ def floor_divide(x: BigUInt, y: BigUInt) raises -> BigUInt: ) debug_assert[assert_mode="none"]( - (len(x.words) == 1) or (x.words[-1] != 0), + (len(x.words) == 1) or (x.words[len(x.words) - 1] != 0), "biguint.arithmetics.floor_divide(): BigUInt x ", x, " has leading zero words!", ) debug_assert[assert_mode="none"]( - (len(y.words) == 1) or (y.words[-1] != 0), + (len(y.words) == 1) or (y.words[len(y.words) - 1] != 0), "biguint.arithmetics.floor_divide(): BigUInt y ", y, " has leading zero words!", @@ -2036,7 +2018,9 @@ def floor_divide(x: BigUInt, y: BigUInt) raises -> BigUInt: # I will normalize the divisor to improve quotient estimation # Calculate normalization factor to make leading digit of divisor # as large as possible - var ndigits_to_shift = calculate_ndigits_for_normalization(y.words[-1]) + var ndigits_to_shift = calculate_ndigits_for_normalization( + y.words[len(y.words) - 1] + ) if ndigits_to_shift == 0: # No normalization needed, just use the general division algorithm @@ -2265,15 +2249,15 @@ def floor_divide_by_uint32(x: BigUInt, y: UInt32) -> BigUInt: ) # Most significant word of the dividend - var dividend = UInt64(x.words[-1] // y) - var carry = UInt64(x.words[-1] % y) + var dividend = UInt64(x.words[len(x.words) - 1] // y) + var carry = UInt64(x.words[len(x.words) - 1] % y) var y_uint64 = UInt64(y) var result: BigUInt if dividend == 0: result = BigUInt(unsafe_uninit_length=len(x.words) - 1) else: result = BigUInt(unsafe_uninit_length=len(x.words)) - result.words[-1] = UInt32(dividend) + result.words[len(result.words) - 1] = UInt32(dividend) # Process the rest of the words for i in range(len(x.words) - 2, -1, -1): @@ -2282,7 +2266,7 @@ def floor_divide_by_uint32(x: BigUInt, y: UInt32) -> BigUInt: carry = dividend % y_uint64 debug_assert[assert_mode="none"]( - (len(result.words) == 1) or (result.words[-1] != 0), + (len(result.words) == 1) or (result.words[len(result.words) - 1] != 0), "biguint.arithmetics.floor_divide_by_uint32(): ", "Result has leading zero words", ) @@ -2310,13 +2294,13 @@ def floor_divide_by_uint32_inplace(mut x: BigUInt, y: UInt32) -> None: ) # Most significant word of the dividend - var dividend = UInt64(x.words[-1] // y) - var carry = UInt64(x.words[-1] % y) + var dividend = UInt64(x.words[len(x.words) - 1] // y) + var carry = UInt64(x.words[len(x.words) - 1] % y) var y_uint64 = UInt64(y) if dividend == 0: x.words.shrink(len(x.words) - 1) else: - x.words[-1] = UInt32(dividend) + x.words[len(x.words) - 1] = UInt32(dividend) # Process the rest of the words for i in range(len(x.words) - 2, -1, -1): @@ -2345,7 +2329,7 @@ def floor_divide_by_uint64(x: BigUInt, y: UInt64) -> BigUInt: var y_uint128 = UInt128(y) var result: BigUInt if len(x.words) % 2 == 1: - carry = UInt128(x.words[-1]) + carry = UInt128(x.words[len(x.words) - 1]) result = BigUInt(unsafe_uninit_length=len(x.words) - 1) else: result = BigUInt(unsafe_uninit_length=len(x.words)) @@ -2383,7 +2367,7 @@ def floor_divide_by_uint64_inplace(mut x: BigUInt, y: UInt64) -> None: var carry = UInt128(0) var y_uint128 = UInt128(y) if len(x.words) % 2 == 1: - carry = UInt128(x.words[-1]) + carry = UInt128(x.words[len(x.words) - 1]) x.words.resize(len(x.words) - 1, UInt32(0)) for i in range(len(x.words) - 1, -1, -2): @@ -2423,7 +2407,7 @@ def floor_divide_by_uint128(x: BigUInt, y: UInt128) -> BigUInt: var y_uint255 = UInt256(y) var result: BigUInt if len(x.words) % 4 == 1: - carry = UInt256(x.words[-1]) + carry = UInt256(x.words[len(x.words) - 1]) result = BigUInt(unsafe_uninit_length=len(x.words) - 1) elif len(x.words) % 4 == 2: carry = UInt256( @@ -2784,10 +2768,10 @@ def floor_divide_burnikel_ziegler( var normalized_a = a.copy() var ndigits_to_shift: Int - if normalized_b.words[-1] < 500_000_000: + if normalized_b.words[len(normalized_b.words) - 1] < 500_000_000: ndigits_to_shift = ( decimo.biguint.arithmetics.calculate_ndigits_for_normalization( - normalized_b.words[-1] + normalized_b.words[len(normalized_b.words) - 1] ) ) else: @@ -2817,12 +2801,18 @@ def floor_divide_burnikel_ziegler( # The normalized_b is now 9 digits, but may still be smaller than 500_000_000. var gap_ratio: UInt32 - if normalized_b.words[-1] >= 500_000_000: # Already normalized + if ( + normalized_b.words[len(normalized_b.words) - 1] >= 500_000_000 + ): # Already normalized gap_ratio = 1 - elif normalized_b.words[-1] >= 250_000_000: # 2x is enough + elif ( + normalized_b.words[len(normalized_b.words) - 1] >= 250_000_000 + ): # 2x is enough gap_ratio = 2 else: # The most significant word is in [100_000_000, 125_000_000) - gap_ratio = BigUInt.BASE_MAX // normalized_b.words[-1] + gap_ratio = ( + BigUInt.BASE_MAX // normalized_b.words[len(normalized_b.words) - 1] + ) if gap_ratio >= 2: decimo.biguint.arithmetics.multiply_by_uint32_inplace( @@ -2843,7 +2833,7 @@ def floor_divide_burnikel_ziegler( # is smaller than 500_000_000. # In this sense, the first 2-by-1 division will generate a quotient # of either 0 or 1, which would exceeds n-word capacity. - if normalized_a.words[-1] >= 500_000_000: + if normalized_a.words[len(normalized_a.words) - 1] >= 500_000_000: t += 1 var z = BigUInt.zero() # Remainder of the division @@ -2926,7 +2916,8 @@ def floor_divide_two_by_one( Otherwise, it will use the schoolbook division algorithm. """ debug_assert[assert_mode="none"]( - b.words[-1] >= 500_000_000, "b[-1] must be at least 500_000_000" + b.words[len(b.words) - 1] >= 500_000_000, + "b[-1] must be at least 500_000_000", ) if (n & 1 == 1) or (n <= cut_off): @@ -3071,7 +3062,7 @@ def floor_divide_slices_two_by_one( """ debug_assert[assert_mode="none"]( - b.words[-1] >= 500_000_000, + b.words[len(b.words) - 1] >= 500_000_000, "floor_divide_slices_two_by_one(): b[-1] must be at least 500_000_000", ) diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index c0a505c4..d3ceca75 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -28,6 +28,7 @@ from std.memory import UnsafePointer, memcpy, memcmp from decimo.bigint10.bigint10 import BigInt10 import decimo.biguint.arithmetics import decimo.biguint.comparison +import decimo.biguint.exponential from decimo.errors import ( ConversionError, ValueError, @@ -1024,8 +1025,10 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): if line_width > 0: var start = 0 var end = line_width - var lines = List[String](capacity=len(result) // line_width + 1) - while end < len(result): + var lines = List[String]( + capacity=(result).byte_length() // line_width + 1 + ) + while end < (result).byte_length(): lines.append(String(result[byte=start:end])) start = end end += line_width @@ -1045,9 +1048,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): """ var result = self.to_string() - var end = len(result) + var end = (result).byte_length() var start = end - 3 - var blocks = List[String](capacity=len(result) // 3 + 1) + var blocks = List[String](capacity=(result).byte_length() // 3 + 1) while start > 0: blocks.append(String(result[byte=start:end])) end = start @@ -1840,9 +1843,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): A formatted string showing the number and its individual words. """ # Collect all labels to find max width - var max_label_len = len("number:") + var max_label_len = ("number:").byte_length() for i in range(len(self.words)): - var label_len = len("word :") + len(String(i)) + var label_len = ("word :").byte_length() + (String(i)).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -1857,7 +1860,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - len("number:")) + result += "number:" + String(" ") * (col - ("number:").byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -1866,7 +1869,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): # word lines for i in range(len(self.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - len(label)) + result += label + String(" ") * (col - (label).byte_length()) result += ( decimo.str.rjust(String(self.words[i]), 9, fillchar="0") + "\n" ) @@ -1891,7 +1894,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): # If there are leading zero words, it means that we have to loop over # all words to check if the number is zero. debug_assert[assert_mode="none"]( - (len(self.words) == 1) or (self.words[-1] != 0), + (len(self.words) == 1) or (self.words[len(self.words) - 1] != 0), "biguint.BigUInt.is_zero(): ", "BigUInt should not contain leading zero words.", ) # 0 should have only one word by design diff --git a/src/decimo/biguint/comparison.mojo b/src/decimo/biguint/comparison.mojo index 92a8ff59..1cf3c8d3 100644 --- a/src/decimo/biguint/comparison.mojo +++ b/src/decimo/biguint/comparison.mojo @@ -35,12 +35,12 @@ def compare(x1: BigUInt, x2: BigUInt) -> Int8: (3) -1 if x1 < x2. """ debug_assert[assert_mode="none"]( - (len(x1.words) == 1) or (x1.words[-1] != 0), + (len(x1.words) == 1) or (x1.words[len(x1.words) - 1] != 0), "biguint.comparison.compare(): ", "BigUInt x1 contains leading zero words.", ) debug_assert[assert_mode="none"]( - (len(x2.words) == 1) or (x2.words[-1] != 0), + (len(x2.words) == 1) or (x2.words[len(x2.words) - 1] != 0), "biguint.comparison.compare(): ", "BigUInt x2 contains leading zero words.", ) diff --git a/src/decimo/decimal128/decimal128.mojo b/src/decimo/decimal128/decimal128.mojo index 810802e8..9bb83ee8 100644 --- a/src/decimo/decimal128/decimal128.mojo +++ b/src/decimo/decimal128/decimal128.mojo @@ -1381,7 +1381,7 @@ struct Decimal128( scale -= 1 var coef_str = String(coef) - var ndigits_coef = len(coef_str) + var ndigits_coef = (coef_str).byte_length() # `leftdigits` is the number of digits to the left of the decimal # point in plain notation (matches the convention used by # `BigDecimal.to_string`). For a coefficient of `n` digits with @@ -1411,7 +1411,7 @@ struct Decimal128( coef_str = coef_str + "0" * (lead_digits - ndigits_coef) result = sign - if len(coef_str) <= lead_digits: + if (coef_str).byte_length() <= lead_digits: result += coef_str else: result += coef_str[byte=:lead_digits] @@ -1550,7 +1550,7 @@ struct Decimal128( return decimo.decimal128.arithmetics.negative(self) @always_inline - fn __bool__(self) -> Bool: + def __bool__(self) -> Bool: """Returns True if the value is nonzero. This enables `if x:` syntax, consistent with Python's `decimal.Decimal`. @@ -2767,13 +2767,13 @@ struct Decimal128( var max_label_len = 0 for i in range(len(labels)): - if len(labels[i]) > max_label_len: - max_label_len = len(labels[i]) + if (labels[i]).byte_length() > max_label_len: + max_label_len = (labels[i]).byte_length() var col = max_label_len + 4 # 4 spaces after longest label - def pad(label: String) -> String: - return label + String(" ") * (col - len(label)) + def pad(label: String) {read col} -> String: + return label + String(" ") * (col - (label).byte_length()) var sep_line = String("-") * (col + 30) @@ -3033,7 +3033,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: ) # includes leading 'E', empty if none # --- Group integer part right-to-left every 3 digits --- - var int_len = len(int_part) + var int_len = (int_part).byte_length() var int_grouped: String if int_len > 3: var blocks = List[String](capacity=int_len // 3 + 1) @@ -3056,7 +3056,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: # --- Group fractional part left-to-right every 3 digits --- var frac_grouped: String - var frac_len = len(frac_part) + var frac_len = (frac_part).byte_length() if frac_len > 3: frac_grouped = String("") var i = 0 diff --git a/src/decimo/errors.mojo b/src/decimo/errors.mojo index 83318f1c..a2f0b471 100644 --- a/src/decimo/errors.mojo +++ b/src/decimo/errors.mojo @@ -171,8 +171,8 @@ struct DecimoError[error_type: StringLiteral = "DecimoError"](Writable): previous_error: An optional previous error that caused this one. """ var loc = call_location() # Comptime evaluated - self.file = _shorten_path(String(loc.file_name)) - self.line = loc.line + self.file = _shorten_path(String(loc.file_name())) + self.line = loc.line() self.function = function self.message = message if previous_error is None: diff --git a/src/decimo/str.mojo b/src/decimo/str.mojo index 381246b3..2a5a2b11 100644 --- a/src/decimo/str.mojo +++ b/src/decimo/str.mojo @@ -32,7 +32,7 @@ def rjust(s: String, width: Int, fillchar: String = " ") -> String: Returns: The right-justified string, or the original string if it is already at least `width` characters. """ - var n = len(s) + var n = s.byte_length() if n >= width: return s return fillchar * (width - n) + s @@ -49,7 +49,7 @@ def ljust(s: String, width: Int, fillchar: String = " ") -> String: Returns: The left-justified string, or the original string if it is already at least `width` characters. """ - var n = len(s) + var n = s.byte_length() if n >= width: return s return s + fillchar * (width - n) @@ -402,10 +402,9 @@ def parse_numeric_string( # Use vectorize to batch-subtract ASCII '0' (48) using SIMD. coef.resize(significant_count, 0) - @parameter def convert_fast[ simd_width: Int - ](i: Int) unified {mut coef, read value_bytes, read extract_start}: + ](i: Int) {mut coef, read value_bytes, read extract_start}: coef.unsafe_ptr().store[width=simd_width]( i, value_bytes.unsafe_ptr().load[width=simd_width]( @@ -426,10 +425,9 @@ def parse_numeric_string( # Region before decimal point if before_count > 0: - @parameter def convert_before[ simd_width: Int - ](i: Int) unified {mut coef, read value_bytes, read extract_start}: + ](i: Int) {mut coef, read value_bytes, read extract_start}: coef.unsafe_ptr().store[width=simd_width]( i, value_bytes.unsafe_ptr().load[width=simd_width]( @@ -443,10 +441,9 @@ def parse_numeric_string( # Region after decimal point if after_count > 0: - @parameter def convert_after[ simd_width: Int - ](i: Int) unified { + ](i: Int) { mut coef, read value_bytes, read decimal_point_pos, diff --git a/src/decimo/tests.mojo b/src/decimo/tests.mojo index b156bd65..4ca1d5e2 100644 --- a/src/decimo/tests.mojo +++ b/src/decimo/tests.mojo @@ -250,7 +250,7 @@ def expand_value(s: String) raises -> String: var result = String() var i = 0 var s_bytes = s.as_bytes() - var slen = len(s) + var slen = s.byte_length() while i < slen: var ch = chr(Int(s_bytes[i])) @@ -269,7 +269,7 @@ def expand_value(s: String) raises -> String: # Find the LAST comma (to handle multi-char repeat strings) var comma_pos = -1 var inner_bytes = inner.as_bytes() - var inner_len = len(inner) + var inner_len = inner.byte_length() var k = inner_len - 1 while k >= 0: if chr(Int(inner_bytes[k])) == ",": diff --git a/src/decimo/toml/parser.mojo b/src/decimo/toml/parser.mojo index 5a7cd188..0f2a369f 100644 --- a/src/decimo/toml/parser.mojo +++ b/src/decimo/toml/parser.mojo @@ -725,12 +725,12 @@ struct TOMLParser: def _parse_integer(self, val_str: String) raises -> TOMLValue: """Parse an integer string, handling hex/octal/binary prefixes.""" - if len(val_str) > 2: + if (val_str).byte_length() > 2: var prefix = String(val_str[byte=:2]) if prefix == "0x" or prefix == "0X": var hex_str = String(val_str[byte=2:]) var result: Int = 0 - for i in range(len(hex_str)): + for i in range((hex_str).byte_length()): var ch = String(hex_str[byte=i]) result *= 16 if ch >= "0" and ch <= "9": @@ -743,7 +743,7 @@ struct TOMLParser: elif prefix == "0o" or prefix == "0O": var oct_str = String(val_str[byte=2:]) var result: Int = 0 - for i in range(len(oct_str)): + for i in range((oct_str).byte_length()): result = result * 8 + ( ord(String(oct_str[byte=i])) - ord("0") ) @@ -751,7 +751,7 @@ struct TOMLParser: elif prefix == "0b" or prefix == "0B": var bin_str = String(val_str[byte=2:]) var result: Int = 0 - for i in range(len(bin_str)): + for i in range((bin_str).byte_length()): result = result * 2 + ( ord(String(bin_str[byte=i])) - ord("0") ) diff --git a/src/decimo/toml/tokenizer.mojo b/src/decimo/toml/tokenizer.mojo index a7be548a..76c6fca7 100644 --- a/src/decimo/toml/tokenizer.mojo +++ b/src/decimo/toml/tokenizer.mojo @@ -90,7 +90,7 @@ struct SourcePosition: self.column = 1 else: self.column += 1 - self.index += len(char) + self.index += (char).byte_length() struct TokenType(Copyable, ImplicitlyCopyable, Movable): @@ -365,14 +365,14 @@ struct Tokenizer: """ self.source = source self.position = SourcePosition() - if len(source) > 0: + if (source).byte_length() > 0: self.current_char = String(source[byte=0]) else: self.current_char = "" def _get_char(self, index: Int) -> String: """Get character at given index or empty string if out of bounds.""" - if index >= len(self.source): + if index >= (self.source).byte_length(): return "" return String(self.source[byte=index]) @@ -548,7 +548,7 @@ struct Tokenizer: hex_str += ch self._advance() var codepoint: Int = 0 - for i in range(len(hex_str)): + for i in range((hex_str).byte_length()): var ch = String(hex_str[byte=i]) codepoint *= 16 if ch >= "0" and ch <= "9": @@ -574,7 +574,7 @@ struct Tokenizer: hex_str += ch self._advance() var codepoint: Int = 0 - for i in range(len(hex_str)): + for i in range((hex_str).byte_length()): var ch = String(hex_str[byte=i]) codepoint *= 16 if ch >= "0" and ch <= "9": @@ -614,7 +614,7 @@ struct Tokenizer: result += self.current_char # 'x'/'o'/'b' self._advance() # Determine valid digit set based on the base prefix - var base_char = String(result[byte=len(result) - 1]) # 'x'/'o'/'b' + var base_char = String(result[byte=(result).byte_length() - 1]) # 'x'/'o'/'b' var digits_found = False if base_char == "x" or base_char == "X": From 90bcfb2fc2e2b9af5cfdf2951a41368da0139fd4 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Tue, 12 May 2026 20:38:43 +0800 Subject: [PATCH 02/10] Remove redundant parentheses --- benches/decimal128/mojo/bench.mojo | 10 +++--- src/cli/limo/line_editor.mojo | 2 +- src/decimo/bigdecimal/bigdecimal.mojo | 2 +- src/decimo/bigint/bigint.mojo | 32 +++++++++---------- src/decimo/bigint/bitwise.mojo | 19 ++++++++--- src/decimo/bigint10/bigint10.mojo | 18 ++++++----- src/decimo/biguint/biguint.mojo | 16 +++++----- src/decimo/decimal128/decimal128.mojo | 14 ++++---- src/decimo/toml/parser.mojo | 8 ++--- src/decimo/toml/tokenizer.mojo | 14 ++++---- .../bigdecimal/test_bigdecimal_creation.mojo | 4 ++- tests/bigint/test_bigint_arithmetics.mojo | 20 +++++++++--- tests/bigint10/test_bigint10_arithmetics.mojo | 12 +++++-- tests/biguint/test_biguint_arithmetics.mojo | 8 +++-- .../test_decimal128_arithmetics.mojo | 4 ++- .../decimal128/test_decimal128_creation.mojo | 4 ++- tests/decimal128/test_decimal128_roots.mojo | 4 ++- 17 files changed, 117 insertions(+), 74 deletions(-) diff --git a/benches/decimal128/mojo/bench.mojo b/benches/decimal128/mojo/bench.mojo index 5f8ca5f9..a1e92a2d 100644 --- a/benches/decimal128/mojo/bench.mojo +++ b/benches/decimal128/mojo/bench.mojo @@ -48,7 +48,7 @@ def _csv_quote(s: String) -> String: def _bench_one[ - Body: fn(a: Decimal128, b: Decimal128) raises capturing[_] -> UInt64, + Body: def(a: Decimal128, b: Decimal128) raises capturing[_] -> UInt64, ](a: Decimal128, b: Decimal128, iters: Int) raises -> Float64: """Run `Body(a, b)` once per inner iter; best-of-5; returns ns/op. @@ -103,7 +103,7 @@ def _bench_to_str(d: Decimal128, iters: Int) raises -> Float64: for _ in range(REPS): var t0 = perf_counter_ns() for _ in range(iters): - sink += UInt64(len(String(d))) + sink += UInt64(String(d).byte_length()) var dt = Int(perf_counter_ns() - t0) if dt < best: best = dt @@ -229,10 +229,10 @@ def _run_case( def _pad(s: String, width: Int) -> String: - if len(s) >= width: + if s.byte_length() >= width: return s var out = s - var pad = width - len(s) + var pad = width - s.byte_length() for _ in range(pad): out += " " return out @@ -278,7 +278,7 @@ def main() raises: var pair = _run_case(op, bc, iters) var result = pair[0] var per = pair[1] - var result_short = result if len(result) <= 30 else String( + var result_short = result if result.byte_length() <= 30 else String( result[byte=0:30] ) print(_pad(bc.name, 40), _pad(result_short, 32), per) diff --git a/src/cli/limo/line_editor.mojo b/src/cli/limo/line_editor.mojo index dbf51fe9..9eb84fb6 100644 --- a/src/cli/limo/line_editor.mojo +++ b/src/cli/limo/line_editor.mojo @@ -274,7 +274,7 @@ struct LineEditor(Movable): def add_history(mut self, line: String): """Adds a line to history manually.""" - if len(line) == 0: + if line.byte_length() == 0: return self._history.append(line) if len(self._history) > self._max_history: diff --git a/src/decimo/bigdecimal/bigdecimal.mojo b/src/decimo/bigdecimal/bigdecimal.mojo index 5e2b83c7..dd687e3c 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -2709,7 +2709,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: frac_part = String(s[byte = dot_pos + 1 : e_pos]) # --- Group integer part (right-to-left every 3 digits) --- - var int_len = (int_part).byte_length() + var int_len = int_part.byte_length() if int_len > 3: var blocks = List[String](capacity=int_len // 3 + 1) var end_i = int_len diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 86b91249..4a97e292 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -786,9 +786,9 @@ struct BigInt( start_idx = 1 # Skip the minus sign var digits_part = String(result[byte=start_idx:]) - var end = (digits_part).byte_length() + var end = digits_part.byte_length() var start = end - 3 - var blocks = List[String](capacity=(digits_part).byte_length() // 3 + 1) + var blocks = List[String](capacity=digits_part.byte_length() // 3 + 1) while start > 0: blocks.append(String(digits_part[byte=start:end])) end = start @@ -824,7 +824,7 @@ struct BigInt( first_word = False else: var h = hex(word)[byte=2:] - for _ in range(8 - (h).byte_length()): + for _ in range(8 - h.byte_length()): result += "0" result += h @@ -856,7 +856,7 @@ struct BigInt( first_word = False else: var b = bin(word)[byte=2:] - for _ in range(32 - (b).byte_length()): + for _ in range(32 - b.byte_length()): result += "0" result += b @@ -1937,11 +1937,11 @@ struct BigInt( fixed_labels.append("sign:") var max_label_len = 0 for i in range(len(fixed_labels)): - if (fixed_labels[i]).byte_length() > max_label_len: - max_label_len = (fixed_labels[i]).byte_length() + if fixed_labels[i].byte_length() > max_label_len: + max_label_len = fixed_labels[i].byte_length() # Check word labels for i in range(len(self.words)): - var label_len = ("word :").byte_length() + (String(i)).byte_length() + var label_len = "word :".byte_length() + String(i).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -1956,7 +1956,7 @@ struct BigInt( var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - ("number:").byte_length()) + result += "number:" + String(" ") * (col - "number:".byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -1965,10 +1965,10 @@ struct BigInt( # number (hex) line var hex_str = self.to_hex_string() var hex_label = String("number (hex):") - result += hex_label + String(" ") * (col - (hex_label).byte_length()) + result += hex_label + String(" ") * (col - hex_label.byte_length()) var hex_start = 0 var first_hex_line = True - while hex_start + value_width < (hex_str).byte_length(): + while hex_start + value_width < hex_str.byte_length(): if not first_hex_line: result += String(" ") * col result += ( @@ -1982,13 +1982,13 @@ struct BigInt( result += String(hex_str[byte=hex_start:]) + "\n" # sign line - result += "sign:" + String(" ") * (col - ("sign:").byte_length()) + result += "sign:" + String(" ") * (col - "sign:".byte_length()) result += String("negative" if self.sign else "non-negative") + "\n" # word lines for i in range(len(self.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - (label).byte_length()) + result += label + String(" ") * (col - label.byte_length()) result += "0x" + decimo.str.rjust( String(hex(self.words[i])[byte=2:]), 8, fillchar="0" ) @@ -2572,20 +2572,20 @@ def _dc_to_str_recursive( # Zero-pad low_str to exactly low_width digits. # Build the result in a pre-allocated byte buffer to avoid O(n) concatenations. - var padding = low_width - (low_str).byte_length() + var padding = low_width - low_str.byte_length() if padding <= 0: return high_str + low_str - var total_len = (high_str).byte_length() + padding + (low_str).byte_length() + var total_len = high_str.byte_length() + padding + low_str.byte_length() var buf = List[UInt8](capacity=total_len) # Copy high_str bytes - for i in range((high_str).byte_length()): + for i in range(high_str.byte_length()): buf.append(high_str.unsafe_ptr()[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()): + for i in range(low_str.byte_length()): buf.append(low_str.unsafe_ptr()[i]) return String(unsafe_from_utf8=buf^) diff --git a/src/decimo/bigint/bitwise.mojo b/src/decimo/bigint/bitwise.mojo index 984772c9..776e40c4 100644 --- a/src/decimo/bigint/bitwise.mojo +++ b/src/decimo/bigint/bitwise.mojo @@ -70,7 +70,10 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: var result_words = List[UInt32](capacity=min_len) for i in range(min_len): result_words.append(a.words[i] & b.words[i]) - while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: + while ( + len(result_words) > 1 + and result_words[len(result_words) - 1] == 0 + ): result_words.shrink(len(result_words) - 1) return BigInt(raw_words=result_words^, sign=False) elif op == "or": @@ -80,7 +83,10 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: var wa = UInt32(0) if i >= len(a.words) else a.words[i] var wb = UInt32(0) if i >= len(b.words) else b.words[i] result_words.append(wa | wb) - while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: + while ( + len(result_words) > 1 + and result_words[len(result_words) - 1] == 0 + ): result_words.shrink(len(result_words) - 1) return BigInt(raw_words=result_words^, sign=False) else: # xor @@ -90,7 +96,10 @@ def _binary_bitwise_op[op: StringLiteral](a: BigInt, b: BigInt) -> BigInt: var wa = UInt32(0) if i >= len(a.words) else a.words[i] var wb = UInt32(0) if i >= len(b.words) else b.words[i] result_words.append(wa ^ wb) - while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: + while ( + len(result_words) > 1 + and result_words[len(result_words) - 1] == 0 + ): result_words.shrink(len(result_words) - 1) return BigInt(raw_words=result_words^, sign=False) @@ -401,7 +410,9 @@ def bitwise_not(x: BigInt) -> BigInt: result_words.append(UInt32(diff & 0xFFFF_FFFF)) borrow = (diff >> 63) & 1 # Strip leading zeros - while len(result_words) > 1 and result_words[len(result_words) - 1] == 0: + while ( + len(result_words) > 1 and result_words[len(result_words) - 1] == 0 + ): result_words.shrink(len(result_words) - 1) if len(result_words) == 1 and result_words[0] == 0: return BigInt() diff --git a/src/decimo/bigint10/bigint10.mojo b/src/decimo/bigint10/bigint10.mojo index 74221bdf..fd76e5e2 100644 --- a/src/decimo/bigint10/bigint10.mojo +++ b/src/decimo/bigint10/bigint10.mojo @@ -534,8 +534,10 @@ struct BigInt10( if line_width > 0: var start = 0 var end = line_width - var lines = List[String](capacity=(result).byte_length() // line_width + 1) - while end < (result).byte_length(): + var lines = List[String]( + capacity=result.byte_length() // line_width + 1 + ) + while end < result.byte_length(): lines.append(String(result[byte=start:end])) start = end end += line_width @@ -555,9 +557,9 @@ struct BigInt10( """ var result = self.to_string() - var end = (result).byte_length() + var end = result.byte_length() var start = end - 3 - var blocks = List[String](capacity=(result).byte_length() // 3 + 1) + var blocks = List[String](capacity=result.byte_length() // 3 + 1) while start > 0: blocks.append(String(result[byte=start:end])) end = start @@ -1179,9 +1181,9 @@ struct BigInt10( A formatted string showing the internal representation. """ # Collect all labels to find max width - var max_label_len = ("number:").byte_length() + var max_label_len = "number:".byte_length() for i in range(len(self.magnitude.words)): - var label_len = ("word :").byte_length() + (String(i)).byte_length() + var label_len = "word :".byte_length() + String(i).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -1196,7 +1198,7 @@ struct BigInt10( var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - ("number:").byte_length()) + result += "number:" + String(" ") * (col - "number:".byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -1205,7 +1207,7 @@ struct BigInt10( # word lines for i in range(len(self.magnitude.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - (label).byte_length()) + result += label + String(" ") * (col - label.byte_length()) result += ( decimo.str.rjust( String(self.magnitude.words[i]), 9, fillchar="0" diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index d3ceca75..313521fb 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -1026,9 +1026,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): var start = 0 var end = line_width var lines = List[String]( - capacity=(result).byte_length() // line_width + 1 + capacity=result.byte_length() // line_width + 1 ) - while end < (result).byte_length(): + while end < result.byte_length(): lines.append(String(result[byte=start:end])) start = end end += line_width @@ -1048,9 +1048,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): """ var result = self.to_string() - var end = (result).byte_length() + var end = result.byte_length() var start = end - 3 - var blocks = List[String](capacity=(result).byte_length() // 3 + 1) + var blocks = List[String](capacity=result.byte_length() // 3 + 1) while start > 0: blocks.append(String(result[byte=start:end])) end = start @@ -1843,9 +1843,9 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): A formatted string showing the number and its individual words. """ # Collect all labels to find max width - var max_label_len = ("number:").byte_length() + var max_label_len = "number:".byte_length() for i in range(len(self.words)): - var label_len = ("word :").byte_length() + (String(i)).byte_length() + var label_len = "word :".byte_length() + String(i).byte_length() if label_len > max_label_len: max_label_len = label_len @@ -1860,7 +1860,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): var string_of_number = self.to_string(line_width=value_width).split( "\n" ) - result += "number:" + String(" ") * (col - ("number:").byte_length()) + result += "number:" + String(" ") * (col - "number:".byte_length()) for i in range(len(string_of_number)): if i > 0: result += String(" ") * col @@ -1869,7 +1869,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): # word lines for i in range(len(self.words)): var label = "word " + String(i) + ":" - result += label + String(" ") * (col - (label).byte_length()) + result += label + String(" ") * (col - label.byte_length()) result += ( decimo.str.rjust(String(self.words[i]), 9, fillchar="0") + "\n" ) diff --git a/src/decimo/decimal128/decimal128.mojo b/src/decimo/decimal128/decimal128.mojo index 9bb83ee8..8b71784a 100644 --- a/src/decimo/decimal128/decimal128.mojo +++ b/src/decimo/decimal128/decimal128.mojo @@ -1381,7 +1381,7 @@ struct Decimal128( scale -= 1 var coef_str = String(coef) - var ndigits_coef = (coef_str).byte_length() + var ndigits_coef = coef_str.byte_length() # `leftdigits` is the number of digits to the left of the decimal # point in plain notation (matches the convention used by # `BigDecimal.to_string`). For a coefficient of `n` digits with @@ -1411,7 +1411,7 @@ struct Decimal128( coef_str = coef_str + "0" * (lead_digits - ndigits_coef) result = sign - if (coef_str).byte_length() <= lead_digits: + if coef_str.byte_length() <= lead_digits: result += coef_str else: result += coef_str[byte=:lead_digits] @@ -2767,13 +2767,13 @@ struct Decimal128( var max_label_len = 0 for i in range(len(labels)): - if (labels[i]).byte_length() > max_label_len: - max_label_len = (labels[i]).byte_length() + if labels[i].byte_length() > max_label_len: + max_label_len = labels[i].byte_length() var col = max_label_len + 4 # 4 spaces after longest label def pad(label: String) {read col} -> String: - return label + String(" ") * (col - (label).byte_length()) + return label + String(" ") * (col - label.byte_length()) var sep_line = String("-") * (col + 30) @@ -3033,7 +3033,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: ) # includes leading 'E', empty if none # --- Group integer part right-to-left every 3 digits --- - var int_len = (int_part).byte_length() + var int_len = int_part.byte_length() var int_grouped: String if int_len > 3: var blocks = List[String](capacity=int_len // 3 + 1) @@ -3056,7 +3056,7 @@ def _insert_digit_separators(s: String, delimiter: String) -> String: # --- Group fractional part left-to-right every 3 digits --- var frac_grouped: String - var frac_len = (frac_part).byte_length() + var frac_len = frac_part.byte_length() if frac_len > 3: frac_grouped = String("") var i = 0 diff --git a/src/decimo/toml/parser.mojo b/src/decimo/toml/parser.mojo index 0f2a369f..4a67cc65 100644 --- a/src/decimo/toml/parser.mojo +++ b/src/decimo/toml/parser.mojo @@ -725,12 +725,12 @@ struct TOMLParser: def _parse_integer(self, val_str: String) raises -> TOMLValue: """Parse an integer string, handling hex/octal/binary prefixes.""" - if (val_str).byte_length() > 2: + if val_str.byte_length() > 2: var prefix = String(val_str[byte=:2]) if prefix == "0x" or prefix == "0X": var hex_str = String(val_str[byte=2:]) var result: Int = 0 - for i in range((hex_str).byte_length()): + for i in range(hex_str.byte_length()): var ch = String(hex_str[byte=i]) result *= 16 if ch >= "0" and ch <= "9": @@ -743,7 +743,7 @@ struct TOMLParser: elif prefix == "0o" or prefix == "0O": var oct_str = String(val_str[byte=2:]) var result: Int = 0 - for i in range((oct_str).byte_length()): + for i in range(oct_str.byte_length()): result = result * 8 + ( ord(String(oct_str[byte=i])) - ord("0") ) @@ -751,7 +751,7 @@ struct TOMLParser: elif prefix == "0b" or prefix == "0B": var bin_str = String(val_str[byte=2:]) var result: Int = 0 - for i in range((bin_str).byte_length()): + for i in range(bin_str.byte_length()): result = result * 2 + ( ord(String(bin_str[byte=i])) - ord("0") ) diff --git a/src/decimo/toml/tokenizer.mojo b/src/decimo/toml/tokenizer.mojo index 76c6fca7..c2abcb08 100644 --- a/src/decimo/toml/tokenizer.mojo +++ b/src/decimo/toml/tokenizer.mojo @@ -90,7 +90,7 @@ struct SourcePosition: self.column = 1 else: self.column += 1 - self.index += (char).byte_length() + self.index += char.byte_length() struct TokenType(Copyable, ImplicitlyCopyable, Movable): @@ -365,14 +365,14 @@ struct Tokenizer: """ self.source = source self.position = SourcePosition() - if (source).byte_length() > 0: + if source.byte_length() > 0: self.current_char = String(source[byte=0]) else: self.current_char = "" def _get_char(self, index: Int) -> String: """Get character at given index or empty string if out of bounds.""" - if index >= (self.source).byte_length(): + if index >= self.source.byte_length(): return "" return String(self.source[byte=index]) @@ -548,7 +548,7 @@ struct Tokenizer: hex_str += ch self._advance() var codepoint: Int = 0 - for i in range((hex_str).byte_length()): + for i in range(hex_str.byte_length()): var ch = String(hex_str[byte=i]) codepoint *= 16 if ch >= "0" and ch <= "9": @@ -574,7 +574,7 @@ struct Tokenizer: hex_str += ch self._advance() var codepoint: Int = 0 - for i in range((hex_str).byte_length()): + for i in range(hex_str.byte_length()): var ch = String(hex_str[byte=i]) codepoint *= 16 if ch >= "0" and ch <= "9": @@ -614,7 +614,9 @@ struct Tokenizer: result += self.current_char # 'x'/'o'/'b' self._advance() # Determine valid digit set based on the base prefix - var base_char = String(result[byte=(result).byte_length() - 1]) # 'x'/'o'/'b' + var base_char = String( + result[byte=result.byte_length() - 1] + ) # 'x'/'o'/'b' var digits_found = False if base_char == "x" or base_char == "X": diff --git a/tests/bigdecimal/test_bigdecimal_creation.mojo b/tests/bigdecimal/test_bigdecimal_creation.mojo index 2c7f1100..b63c2b40 100644 --- a/tests/bigdecimal/test_bigdecimal_creation.mojo +++ b/tests/bigdecimal/test_bigdecimal_creation.mojo @@ -9,7 +9,9 @@ from decimo.bigdecimal.bigdecimal import BigDecimal from decimo.tests import TestCase, parse_file, load_test_cases from decimo.toml.parser import TOMLDocument -comptime from_string_file_path = "tests/bigdecimal/test_data/bigdecimal_from_string.toml" +comptime from_string_file_path = ( + "tests/bigdecimal/test_data/bigdecimal_from_string.toml" +) def _run_from_string_section( diff --git a/tests/bigint/test_bigint_arithmetics.mojo b/tests/bigint/test_bigint_arithmetics.mojo index 51547aaf..75e22974 100644 --- a/tests/bigint/test_bigint_arithmetics.mojo +++ b/tests/bigint/test_bigint_arithmetics.mojo @@ -11,14 +11,24 @@ from std import testing from decimo.bigint.bigint import BigInt from decimo.tests import TestCase, parse_file, load_test_cases -comptime file_path_arithmetics = "tests/bigint10/test_data/bigint10_arithmetics.toml" +comptime file_path_arithmetics = ( + "tests/bigint10/test_data/bigint10_arithmetics.toml" +) comptime file_path_multiply = "tests/bigint10/test_data/bigint10_multiply.toml" -comptime file_path_floor_divide = "tests/bigint10/test_data/bigint10_floor_divide.toml" -comptime file_path_truncate_divide = "tests/bigint10/test_data/bigint10_truncate_divide.toml" +comptime file_path_floor_divide = ( + "tests/bigint10/test_data/bigint10_floor_divide.toml" +) +comptime file_path_truncate_divide = ( + "tests/bigint10/test_data/bigint10_truncate_divide.toml" +) # BigUInt TOML test data (unsigned, all positive values) -comptime file_path_biguint_arithmetics = "tests/biguint/test_data/biguint_arithmetics.toml" -comptime file_path_biguint_truncate_divide = "tests/biguint/test_data/biguint_truncate_divide.toml" +comptime file_path_biguint_arithmetics = ( + "tests/biguint/test_data/biguint_arithmetics.toml" +) +comptime file_path_biguint_truncate_divide = ( + "tests/biguint/test_data/biguint_truncate_divide.toml" +) def _set_max_str_digits(limit: Int) raises: diff --git a/tests/bigint10/test_bigint10_arithmetics.mojo b/tests/bigint10/test_bigint10_arithmetics.mojo index 99f8ebb8..7ab53c08 100644 --- a/tests/bigint10/test_bigint10_arithmetics.mojo +++ b/tests/bigint10/test_bigint10_arithmetics.mojo @@ -7,10 +7,16 @@ from std import testing from decimo.bigint10.bigint10 import BigInt10 from decimo.tests import TestCase, parse_file, load_test_cases -comptime file_path_arithmetics = "tests/bigint10/test_data/bigint10_arithmetics.toml" +comptime file_path_arithmetics = ( + "tests/bigint10/test_data/bigint10_arithmetics.toml" +) comptime file_path_multiply = "tests/bigint10/test_data/bigint10_multiply.toml" -comptime file_path_floor_divide = "tests/bigint10/test_data/bigint10_floor_divide.toml" -comptime file_path_truncate_divide = "tests/bigint10/test_data/bigint10_truncate_divide.toml" +comptime file_path_floor_divide = ( + "tests/bigint10/test_data/bigint10_floor_divide.toml" +) +comptime file_path_truncate_divide = ( + "tests/bigint10/test_data/bigint10_truncate_divide.toml" +) def _set_max_str_digits(limit: Int) raises: diff --git a/tests/biguint/test_biguint_arithmetics.mojo b/tests/biguint/test_biguint_arithmetics.mojo index d1b50d18..29081419 100644 --- a/tests/biguint/test_biguint_arithmetics.mojo +++ b/tests/biguint/test_biguint_arithmetics.mojo @@ -11,8 +11,12 @@ from std.testing import assert_equal, assert_true from decimo.biguint.biguint import BigUInt from decimo.tests import TestCase, parse_file, load_test_cases -comptime file_path_arithmetics = "tests/biguint/test_data/biguint_arithmetics.toml" -comptime file_path_truncate_divide = "tests/biguint/test_data/biguint_truncate_divide.toml" +comptime file_path_arithmetics = ( + "tests/biguint/test_data/biguint_arithmetics.toml" +) +comptime file_path_truncate_divide = ( + "tests/biguint/test_data/biguint_truncate_divide.toml" +) def _set_max_str_digits(limit: Int) raises: diff --git a/tests/decimal128/test_decimal128_arithmetics.mojo b/tests/decimal128/test_decimal128_arithmetics.mojo index dbc3b902..6290688c 100644 --- a/tests/decimal128/test_decimal128_arithmetics.mojo +++ b/tests/decimal128/test_decimal128_arithmetics.mojo @@ -18,7 +18,9 @@ from decimo.rounding_mode import RoundingMode from decimo.tests import TestCase, parse_file, load_test_cases -comptime arithmetics_path = "tests/decimal128/test_data/decimal128_arithmetics.toml" +comptime arithmetics_path = ( + "tests/decimal128/test_data/decimal128_arithmetics.toml" +) comptime multiply_path = "tests/decimal128/test_data/decimal128_multiply.toml" comptime divide_path = "tests/decimal128/test_data/decimal128_divide.toml" comptime modulo_path = "tests/decimal128/test_data/decimal128_modulo.toml" diff --git a/tests/decimal128/test_decimal128_creation.mojo b/tests/decimal128/test_decimal128_creation.mojo index 622b3f2b..3d7f9e6f 100644 --- a/tests/decimal128/test_decimal128_creation.mojo +++ b/tests/decimal128/test_decimal128_creation.mojo @@ -18,7 +18,9 @@ from decimo import BigDecimal from decimo.tests import TestCase, parse_file, load_test_cases -comptime from_string_path = "tests/decimal128/test_data/decimal128_from_string.toml" +comptime from_string_path = ( + "tests/decimal128/test_data/decimal128_from_string.toml" +) comptime from_int_path = "tests/decimal128/test_data/decimal128_from_int.toml" diff --git a/tests/decimal128/test_decimal128_roots.mojo b/tests/decimal128/test_decimal128_roots.mojo index c6e10515..75ab52c7 100644 --- a/tests/decimal128/test_decimal128_roots.mojo +++ b/tests/decimal128/test_decimal128_roots.mojo @@ -17,7 +17,9 @@ from decimo.tests import parse_file, load_test_cases comptime sqrt_path = "tests/decimal128/test_data/decimal128_sqrt.toml" -comptime root_power_path = "tests/decimal128/test_data/decimal128_root_power.toml" +comptime root_power_path = ( + "tests/decimal128/test_data/decimal128_root_power.toml" +) # ───────────────────────────────────────────────────────────────────────────── From c786a88a3876ff1b3f8269ee4c87b6d0be2df0b2 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 00:30:31 +0800 Subject: [PATCH 03/10] Update utility --- src/decimo/decimal128/utility.mojo | 373 +++++++++++++++++------------ tests/test.sh | 17 +- 2 files changed, 239 insertions(+), 151 deletions(-) diff --git a/src/decimo/decimal128/utility.mojo b/src/decimo/decimal128/utility.mojo index 34cef831..c07584e0 100644 --- a/src/decimo/decimal128/utility.mojo +++ b/src/decimo/decimal128/utility.mojo @@ -1199,100 +1199,102 @@ def power_of_10[ # ===----------------------------------------------------------------------=== # -comptime _POWER_OF_10_U128_BLOB = ( - "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\xe8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x10\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\xa0\x86\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x40\x42\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x80\x96\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xe1\xf5\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xca\x9a\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xe4\x0b\x54\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xe8\x76\x48\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x10\xa5\xd4\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xa0\x72\x4e\x18\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x40\x7a\x10\xf3\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x80\xc6\xa4\x7e\x8d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\xc1\x6f\xf2\x86\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x8a\x5d\x78\x45\x63\x01\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x64\xa7\xb3\xb6\xe0\x0d\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\xe8\x89\x04\x23\xc7\x8a\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x10\x63\x2d\x5e\xc7\x6b\x05\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\xa0\xde\xc5\xad\xc9\x35\x36\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x40\xb2\xba\xc9\xe0\x19\x1e\x02\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x80\xf6\x4a\xe1\xc7\x02\x2d\x15\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xa1\xed\xcc\xce\x1b\xc2\xd3\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x4a\x48\x01\x14\x16\x95\x45\x08\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xe4\xd2\x0c\xc8\xdc\xd2\xb7\x52\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xe8\x3c\x80\xd0\x9f\x3c\x2e\x3b\x03\x00\x00\x00\x00" - + "\x00\x00\x00\x10\x61\x02\x25\x3e\x5e\xce\x4f\x20\x00\x00\x00\x00" - + "\x00\x00\x00\xa0\xca\x17\x72\x6d\xae\x0f\x1e\x43\x01\x00\x00\x00" +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_BLOB = ( - "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\xe8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x10\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\xa0\x86\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x40\x42\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x80\x96\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xe1\xf5\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xca\x9a\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xe4\x0b\x54\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xe8\x76\x48\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x10\xa5\xd4\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\xa0\x72\x4e\x18\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x40\x7a\x10\xf3\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x80\xc6\xa4\x7e\x8d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\xc1\x6f\xf2\x86\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x8a\x5d\x78\x45\x63\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x64\xa7\xb3\xb6\xe0\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\xe8\x89\x04\x23\xc7\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x10\x63\x2d\x5e\xc7\x6b\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\xa0\xde\xc5\xad\xc9\x35\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x40\xb2\xba\xc9\xe0\x19\x1e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x80\xf6\x4a\xe1\xc7\x02\x2d\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xa1\xed\xcc\xce\x1b\xc2\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x4a\x48\x01\x14\x16\x95\x45\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xe4\xd2\x0c\xc8\xdc\xd2\xb7\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xe8\x3c\x80\xd0\x9f\x3c\x2e\x3b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x10\x61\x02\x25\x3e\x5e\xce\x4f\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\xa0\xca\x17\x72\x6d\xae\x0f\x1e\x43\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x40\xea\xed\x74\x46\xd0\x9c\x2c\x9f\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x80\x26\x4b\x91\xc0\x22\x20\xbe\x37\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x81\xef\xac\x85\x5b\x41\x6d\x2d\xee\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x0a\x5b\xc1\x38\x93\x8d\x44\xc6\x4d\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x64\x8e\x8d\x37\xc0\x87\xad\xbe\x09\xed\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\xe8\x8f\x87\x2b\x82\x4d\xc7\x72\x61\x42\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x10\x9f\x4b\xb3\x15\x07\xc9\x7b\xce\x97\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\xa0\x36\xf4\x00\xd9\x46\xda\xd5\x10\xee\x85\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x40\x22\x8a\x09\x7a\xc4\x86\x5a\xa8\x4c\x3b\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x80\x56\x65\x5f\xc4\xac\x43\x89\x93\xfe\x50\xf0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x61\xf5\xb9\xab\xbf\xa4\x5c\xc3\xf1\x29\x63\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\xca\x95\x43\xb5\x7c\x6f\x9e\xa1\x71\xa3\xdf\x25\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\xe4\xd9\xa3\x14\xdf\x5a\x30\x50\x70\x62\xbc\x7a\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\xe8\x82\x66\xce\xb6\x8c\xe3\x21\x63\xd8\x5b\xcb\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x10\x1d\x01\x10\x24\x7f\xe3\x52\xdf\x73\x96\xf1\x7b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\xa0\x22\x0b\xa0\x68\xf7\xe2\x3c\xb9\x86\xe0\x6f\xd7\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x40\x5a\x6f\x40\x16\xaa\xdd\x60\x3c\x43\xc5\x5e\x6a\xc0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x80\x86\x59\x84\xde\xa4\xa8\xc8\x5b\xa0\xb4\xb3\x27\x84\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x41\x7f\x2b\xb1\x70\x96\xd6\x95\x43\x0e\x05\x8d\x29\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x8a\xf8\xb2\xeb\x66\xe0\x61\xda\xa3\x8e\x32\x82\x9f\xd7\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x64\xb5\xfd\x34\x05\xc4\xd2\x87\x66\x92\xf9\x15\x3b\x6c\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\xe8\x15\xe9\x11\x34\xa8\x3b\x4e\x01\xb8\xbf\xdb\x4e\x3a\xac\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x10\xdb\x1a\xb3\x08\x92\x54\x0e\x0d\x30\x7d\x95\x14\x47\xba\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\xa0\x8e\x0c\xff\x56\xb4\x4d\x8f\x82\xe0\xe3\xd6\xcd\xc6\x46\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x40\x92\x7d\xf6\x65\x0b\x09\x99\x19\xc5\xe6\x64\x0a\xc4\xc3\x70\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x80\xb6\xe7\xa0\xfb\x71\x5a\xfa\xff\xb2\x03\xf1\x67\xa8\xa5\x67\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x00\x21\x0d\x49\xd4\x73\x88\xc7\xff\xfd\x24\x6a\x0f\x94\x78\x0c\x14\x04\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x00\x4a\x83\xda\x4a\x86\x54\xcb\xfd\xeb\x71\x25\x9a\xc8\xb5\x7c\xc8\x28\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x00\x00\x00\x00\x00\x00\x00\xe4\x20\x89\xec\x3e\x4d\xf1\xe9\x37\x73\x76\x05\xd6\x19\xdf\xd4\x97\x01\x00\x00\x00\x00\x00\x00\x00" +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, ) @@ -1351,28 +1353,13 @@ def power_of_10_unsafe[ n >= 0 and n <= 29, "power_of_10_unsafe[uint128]: n out of range, must be 0..29", ) - # `alignment=1`: `StringLiteral` rodata is only byte-aligned, but a - # bare `bitcast[Scalar[uint128]]()[n]` would tell LLVM the load is - # 16-byte aligned (the natural alignment of `UInt128`). On strict - # platforms (e.g. some ARM cores) that can fault if the compiler - # emits an aligned-only instruction. The explicit `alignment=1` - # forces an unaligned load (same machine code on x86_64 / Apple - # Silicon, but portably correct). - return ( - _POWER_OF_10_U128_BLOB.unsafe_ptr() - .bitcast[Scalar[dtype]]() - .load[alignment=1](n) - ) + return rebind[Scalar[dtype]](_POWER_OF_10_U128[n]) else: debug_assert( n >= 0 and n <= 58, "power_of_10_unsafe[uint256]: n out of range, must be 0..58", ) - return ( - _POWER_OF_10_U256_BLOB.unsafe_ptr() - .bitcast[Scalar[dtype]]() - .load[alignment=1](n) - ) + return rebind[Scalar[dtype]](_POWER_OF_10_U256[n]) # ===----------------------------------------------------------------------=== # @@ -1453,46 +1440,133 @@ 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_BLOB = ( - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - + "\x9a\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99" - + "\xaf\x47\xe1\x7a\x14\xae\x47\xe1\x7a\x14\xae\x47\xe1\x7a\x14\xae\x47\xe1\x7a\x14\xae\x47\xe1\x7a\x14\xae\x47\xe1\x7a\x14\xae\x47" - + "\xbf\x9f\x1a\x2f\xdd\x24\x06\x81\x95\x43\x8b\x6c\xe7\xfb\xa9\xf1\xd2\x4d\x62\x10\x58\x39\xb4\xc8\x76\xbe\x9f\x1a\x2f\xdd\x24\x06" - + "\x98\xff\x90\x7e\xfb\x3a\x70\xce\x88\xd2\xde\xe0\x0b\x93\xa9\x82\x51\x49\x9d\x80\x26\xc2\x86\xa7\x57\xca\x32\xc4\xb1\x2e\x6e\xa3" - + "\x79\xcc\x40\x65\xfc\xfb\x8c\x0b\x07\x42\xb2\x80\x09\xdc\xba\x9b\xa7\x3a\xe4\x66\xb8\x01\x9f\x1f\x46\x08\x8f\x36\x8e\x58\x8b\x4f" - + "\x2e\x3d\x9a\xea\xc9\xfc\xa3\x6f\xd2\x34\x28\x9a\x07\xb0\xc8\xaf\x1f\x62\x83\x85\x93\x34\x7f\x4c\x6b\xd3\xd8\x5e\x0b\x7a\x6f\x0c" - + "\x49\xc8\xf6\x10\x43\x61\x06\x19\xb7\x87\x73\xc3\xa5\x19\x41\x19\x99\x36\xd2\x08\xec\x20\x65\x7a\x78\x85\xf4\xca\xab\x29\x7f\xad" - + "\xa1\x06\x5f\xda\x68\xe7\xd1\xe0\xf8\xd2\xc2\x02\xeb\x7a\x9a\x7a\x7a\xf8\x74\x6d\x56\x1a\x84\xfb\xf9\x9d\xc3\x08\x23\xee\x98\x57" - + "\x4e\x05\x4c\x48\xba\x52\x0e\xe7\x93\x75\x35\x02\xbc\xc8\xae\xfb\x61\x60\x2a\xf1\x11\x15\xd0\x62\x2e\x4b\x69\x6d\x82\xbe\xe0\x12" - + "\x16\xa2\x79\x40\x5d\x84\xb0\x71\xb9\x55\x22\x9d\xf9\x0d\x7e\x5f\x36\x9a\x10\xb5\x1c\x88\xe6\x6a\x7d\xab\xdb\x7b\x9d\xfd\xcd\xb7" - + "\xab\x81\x94\x33\xe4\x69\xc0\x27\x61\x11\xb5\x7d\x94\x71\xfe\xe5\x91\xae\x73\x2a\x4a\xd3\x1e\xef\xfd\x55\x49\x96\x17\xfe\xd7\x5f" - + "\x89\x34\xdd\xc2\xe9\x87\x33\x86\x1a\x41\xf7\xca\x76\xf4\x31\xeb\xa7\x8b\x5c\x88\x6e\x0f\x7f\xf2\x97\x11\xa1\xde\x12\x98\x79\x19" - + "\x0e\x54\xc8\x37\xa9\x0c\xec\x09\xc4\x01\xf2\x77\x24\x87\xe9\x11\x73\xdf\x60\x0d\xe4\x4b\xcb\x50\x26\x1c\x68\x97\x84\x26\x5c\xc2" - + "\x0b\x10\x6d\xf9\x20\x0a\xf0\x07\xd0\x67\x8e\xf9\xe9\x38\x21\xdb\x28\x19\xe7\x3d\x83\x09\x09\xa7\x1e\xb0\xb9\x12\x6a\xb8\x49\x68" - + "\xd6\x0c\x24\x61\x1a\x08\xc0\x6c\xa6\xec\x71\x94\x21\xc7\x4d\xaf\x20\x14\xec\x97\x02\x6e\x3a\x1f\xb2\x59\x61\x75\xee\xf9\x3a\x20" - + "\x56\xe1\x6c\x9b\x90\xa6\x99\x47\x0a\xe1\x4f\xba\x35\xd8\xe2\x7e\x67\x53\x13\xf3\xd0\x7c\x5d\x98\xb6\xc2\x9b\x88\x7d\x29\x2b\xcd" - + "\x45\xb4\xf0\x15\xda\x1e\xae\x9f\x6e\x1a\x73\xfb\x2a\xe0\x1b\xff\x85\x0f\xa9\xf5\x73\xfd\x7d\x13\x92\x68\x49\x6d\x64\x54\xef\x70" - + "\x6b\xc3\xf3\x77\xae\x18\x58\x19\xf2\xe1\x28\xc9\x88\xe6\xaf\x65\x9e\x3f\x87\xc4\x5c\x64\xfe\x75\x0e\xba\x3a\x24\x1d\xdd\x25\x27" - + "\x11\x9f\x1f\xf3\xe3\x8d\x26\xc2\xe9\xcf\xa7\x0e\x0e\xa4\x4c\x3c\xca\x65\xd8\xa0\xc7\xd3\x63\x56\x4a\xc3\x2a\x6d\xfb\x94\x3c\xd8" - + "\x74\xb2\x7f\xc2\x1c\x0b\x52\x9b\x54\xa6\xec\x3e\x0b\x50\x3d\x30\x08\xeb\x79\x4d\x39\x76\xe9\x11\xd5\x35\x22\x24\xc9\x10\xca\x79" - + "\x29\xf5\x32\x35\x4a\x6f\x0e\x49\xdd\x51\xbd\x98\xa2\xd9\xfd\x8c\x06\xbc\x94\xd7\x2d\xf8\xed\xa7\xdd\xf7\xb4\xe9\xa0\x40\x3b\x2e" - + "\x42\x88\x51\x88\x43\xe5\xe3\x74\xc8\x4f\x95\x27\x04\x29\x96\xe1\x70\xc6\xba\x25\x16\x8d\x49\xa6\x62\x59\xee\x75\x01\x01\x92\xe3" - + "\xcf\x39\x41\xa0\xcf\x1d\x83\x5d\xa0\x0c\x11\x86\x36\x87\xde\x1a\x27\x05\x2f\x1e\x78\x0a\x6e\xeb\x4e\x14\x25\x2b\x01\x34\xdb\x82" - + "\xd9\xc7\xcd\x19\xa6\xe4\x68\xe4\x19\x0a\x74\x9e\x2b\x6c\x18\xaf\x85\x6a\xf2\xe4\x2c\xd5\x24\x89\xa5\x76\xea\x88\x9a\x29\x7c\x35" - + "\xc1\x3f\x49\x29\x70\x07\xdb\xd3\x8f\x76\x86\xfd\x78\x13\x27\x18\x09\x44\xea\x07\x7b\xbb\x07\x75\xa2\x8a\xdd\xa7\x5d\x0f\x2d\xef" - + "\xcd\xff\xa0\xba\x59\x6c\xe2\x0f\x73\xf8\xd1\xca\x60\xdc\xb8\x79\x3a\x03\x55\x06\xfc\x95\x6c\x2a\xb5\x3b\xb1\xec\x4a\x0c\x24\x8c" - + "\x0b\x33\xe7\x2e\xae\x56\xe8\x3f\x8f\x93\x41\xa2\x80\xe3\x93\x94\xfb\x68\xaa\x9e\xc9\x44\xbd\xee\x90\xfc\xc0\x23\x6f\xa3\xe9\x3c" - + "\x11\xb8\x3e\x7e\xe3\xbd\x73\x99\x4b\x1f\x9c\x03\x01\x6c\xb9\xed\xf8\xa7\x10\x31\xdc\x3a\x95\x17\x1b\x94\x01\x06\xe5\x6b\x0f\xfb" - + "\xa7\xf9\xfe\x64\x1c\xcb\x8f\x47\x09\x19\xb0\xcf\x00\xf0\x2d\xbe\x60\x86\x40\x27\xb0\xc8\xdd\x12\x7c\x76\x34\x6b\xea\xef\xa5\x95" +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, ) # 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_BLOB = ( - "\x00\x03\x06\x09\x0d\x10\x13\x17\x1a\x1d" - + "\x21\x24\x27\x2b\x2e\x31\x35\x38\x3b\x3f" - + "\x42\x45\x49\x4c\x4f\x53\x56\x59\x5d\x60" +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, ) @@ -1522,13 +1596,12 @@ def udiv_u256_by_pow10_gm(value: UInt256, k: Int) -> UInt256: `ell - 1` for each `d = 10^k` are precomputed in the `_GM_RECIPROCAL_BLOB` and `_GM_SHIFT_BLOB` rodata blobs. """ - # `alignment=1`: see the corresponding note in `power_of_10_unsafe`. - # `StringLiteral.unsafe_ptr()` only guarantees byte alignment, so we - # must request an explicitly unaligned 32-byte load to remain portable. - var mp = ( - _GM_RECIPROCAL_BLOB.unsafe_ptr().bitcast[UInt256]().load[alignment=1](k) - ) - var shift = Int(_GM_SHIFT_BLOB.unsafe_ptr()[k]) + # 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]) var t1 = _mulhi_u256(mp, value) var t = ((value - t1) >> 1) + t1 return t >> UInt256(shift) diff --git a/tests/test.sh b/tests/test.sh index dbcb7848..27a951f2 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -35,7 +35,22 @@ run_mojo_suite() { local dir="$1" for f in tests/"$dir"/*.mojo; do echo "=== $f ===" - pixi run mojo run -I src -D ASSERT=all --debug-level=full "$f" + # Retry once on transient Python init crash (libpython sporadic load failure). + local attempt=1 + local max_attempts=2 + while (( attempt <= max_attempts )); do + if pixi run mojo run -I tests -D ASSERT=all --debug-level=full "$f"; then + break + fi + local rc=$? + if (( attempt < max_attempts )); then + echo "WARN: $f failed (rc=$rc), retrying (attempt $((attempt + 1))/$max_attempts)..." + attempt=$((attempt + 1)) + else + echo "ERROR: $f failed after $max_attempts attempts" + return $rc + fi + done done } From c727cf3e06e0b58fbc97f0bdf41f225b721e3da4 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 01:08:43 +0800 Subject: [PATCH 04/10] Fix --- pixi.toml | 16 +++++++++++----- src/decimo/bigdecimal/bigdecimal.mojo | 3 ++- src/decimo/bigint/bigint.mojo | 3 ++- src/decimo/biguint/biguint.mojo | 2 +- src/decimo/toml/__init__.mojo | 3 +-- .../test_bigdecimal_trigonometric.mojo | 12 +++++++----- tests/test.sh | 2 +- tests/test_cli.sh | 2 +- 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/pixi.toml b/pixi.toml index fc37344a..f2cf3165 100644 --- a/pixi.toml +++ b/pixi.toml @@ -9,7 +9,7 @@ readme = "README.md" version = "0.10.0" [dependencies] -# argmojo = ">=0.5.0,<0.6.0" # CLI argument parsing for the Decimo calculator +# argmojo = "==0.6.0" # CLI argument parsing for the Decimo calculator mojo = ">=1.0.0b1,<2" # Mojo language compiler and runtime python = ">=3.13" # For Python bindings and tests python-build = ">=0.2.0" # Build PyPI wheel (`pixi run wheel`) @@ -26,14 +26,20 @@ format = """pixi run mojo format ./src \ &&pixi run ruff format ./python""" # doc +# Note: the CLI calculator doc step uses `-I tests` (the prebuilt +# `decimo.mojopkg`) instead of `-I src`. Mojo 1.0.0b1's `mojo doc` cannot +# resolve `decimo.X.Y.foo`-style qualified references when re-traversing +# 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`. doc = """pixi run mojo doc --diagnose-missing-doc-strings src/decimo > /dev/null \ -&& pixi run mojo doc --diagnose-missing-doc-strings -I src src/cli/calculator > /dev/null""" +&& pixi run mojo doc --diagnose-missing-doc-strings -I tests src/cli/calculator > /dev/null""" # compile the package p = "clear && pixi run package" package = """pixi run format \ -&&pixi run doc \ -&&pixi run package_decimo""" +&&pixi run package_decimo \ +&&pixi run doc""" package_decimo = """pixi run mojo package src/decimo \ &&cp decimo.mojopkg tests/ \ &&cp decimo.mojopkg benches/ \ @@ -94,7 +100,7 @@ testcli = "pixi run buildcli && bash tests/test.sh cli" # python bindings (mojo4py) bpy = "clear && pixi run buildpy" buildpy = """pixi run mojo build python/decimo_module.mojo \ ---emit shared-lib -I src -o python/src/decimo/_decimo.so""" +--emit shared-lib -I tests -o python/src/decimo/_decimo.so""" testpy = "pixi run buildpy && pixi run python python/tests/test_decimo.py" tpy = "clear && pixi run testpy" # build PyPI wheel (placeholder, no .so included) diff --git a/src/decimo/bigdecimal/bigdecimal.mojo b/src/decimo/bigdecimal/bigdecimal.mojo index dd687e3c..54ca8bfc 100644 --- a/src/decimo/bigdecimal/bigdecimal.mojo +++ b/src/decimo/bigdecimal/bigdecimal.mojo @@ -29,6 +29,7 @@ from std import testing from decimo.errors import ConversionError, ValueError from decimo.rounding_mode import RoundingMode +from decimo.bigdecimal.exponential import MathCache from decimo.bigdecimal.rounding import round_to_precision from decimo.bigint10.bigint10 import BigInt10 import decimo.str @@ -1758,7 +1759,7 @@ struct BigDecimal( def ln( self, precision: Int, - mut cache: decimo.bigdecimal.exponential.MathCache, + mut cache: MathCache, ) raises -> Self: """Returns the natural logarithm using a cache for ln(2)/ln(1.25). diff --git a/src/decimo/bigint/bigint.mojo b/src/decimo/bigint/bigint.mojo index 4a97e292..776a6c55 100644 --- a/src/decimo/bigint/bigint.mojo +++ b/src/decimo/bigint/bigint.mojo @@ -493,8 +493,9 @@ struct BigInt( ), ) # Check that the fractional digits are all zero + var coef_len = len(coef) for i in range(1, scale + 1): - if coef[-i] != 0: + if coef[coef_len - i] != 0: raise ConversionError( function="BigInt.from_string(value: String)", message=( diff --git a/src/decimo/biguint/biguint.mojo b/src/decimo/biguint/biguint.mojo index 313521fb..de633835 100644 --- a/src/decimo/biguint/biguint.mojo +++ b/src/decimo/biguint/biguint.mojo @@ -689,7 +689,7 @@ struct BigUInt(Absable, Copyable, IntableRaising, Movable, Writable): ), ) for i in range(1, scale + 1): - if coef[-i] != 0: + if coef[len(coef) - i] != 0: raise ConversionError( function="BigUInt.from_string(value: String)", message=( diff --git a/src/decimo/toml/__init__.mojo b/src/decimo/toml/__init__.mojo index 1c471527..72f7050d 100644 --- a/src/decimo/toml/__init__.mojo +++ b/src/decimo/toml/__init__.mojo @@ -14,8 +14,7 @@ # limitations under the License. # ===----------------------------------------------------------------------=== # -""" -decimo.toml — A native TOML v1.0 parser for Mojo. +"""A native TOML v1.0 parser for Mojo. (Originally named tomlmojo, now merged into decimo as a subpackage.) diff --git a/tests/bigdecimal/test_bigdecimal_trigonometric.mojo b/tests/bigdecimal/test_bigdecimal_trigonometric.mojo index 12dbe4fa..cb759070 100644 --- a/tests/bigdecimal/test_bigdecimal_trigonometric.mojo +++ b/tests/bigdecimal/test_bigdecimal_trigonometric.mojo @@ -1,19 +1,20 @@ """ -Test BigDecimal trigonometric functions +Tests BigDecimal trigonometric functions. """ from std.python import Python from std import testing -from decimo import BDec +from decimo import BigDecimal from decimo.tests import TestCase, parse_file, load_test_cases from decimo.toml.parser import TOMLDocument +import decimo.bigdecimal.trigonometric comptime file_path = "tests/bigdecimal/test_data/bigdecimal_trigonometric.toml" def run_test[ - func: def(BDec, Int) raises -> BDec + func: def(BigDecimal, Int) thin raises -> BigDecimal ](toml: TOMLDocument, table_name: String, msg: String) raises: """Run a specific test case from the TOML document.""" # print("------------------------------------------------------") @@ -21,11 +22,12 @@ def run_test[ var test_cases = load_test_cases(toml, table_name) count_wrong = 0 for test_case in test_cases: - var result = func(BDec(test_case.a), 50) + var _bdec = BigDecimal(test_case.a) + var result = func(_bdec, 50) try: testing.assert_equal( lhs=result, - rhs=BDec(test_case.expected), + rhs=BigDecimal(test_case.expected), msg=test_case.description, ) except e: diff --git a/tests/test.sh b/tests/test.sh index 27a951f2..75ec426a 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -95,7 +95,7 @@ run_bigfloat() { run_cli() { # CLI tests need the extra -I src/cli include path for f in tests/cli/*.mojo; do - pixi run mojo run -I src -I src/cli -D ASSERT=all --debug-level=full "$f" + pixi run mojo run -I tests -I src/cli -D ASSERT=all --debug-level=full "$f" done # Integration tests (exercise the compiled binary) diff --git a/tests/test_cli.sh b/tests/test_cli.sh index ec7e4075..dd3b0626 100644 --- a/tests/test_cli.sh +++ b/tests/test_cli.sh @@ -8,7 +8,7 @@ cd "$REPO_ROOT" # ── Unit tests ───────────────────────────────────────────────────────────── for f in tests/cli/*.mojo; do - pixi run mojo run -I src -I src/cli -D ASSERT=all --debug-level=full "$f" + pixi run mojo run -I tests -I src/cli -D ASSERT=all --debug-level=full "$f" done # ── Integration tests (exercise the compiled binary) ─────────────────────── From 92092b8cd27a8044fcdf7262eea4a9272fcbdac8 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 01:16:44 +0800 Subject: [PATCH 05/10] doc --- .github/workflows/run_tests.yaml | 31 +++++++++++++++++++------------ src/cli/calculator/evaluator.mojo | 9 +++++++++ src/cli/calculator/repl.mojo | 5 +++++ src/cli/calculator/settings.mojo | 4 ++++ src/decimo/toml/parser.mojo | 5 +++++ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/.github/workflows/run_tests.yaml b/.github/workflows/run_tests.yaml index 3b138386..f386766b 100644 --- a/.github/workflows/run_tests.yaml +++ b/.github/workflows/run_tests.yaml @@ -37,34 +37,41 @@ jobs: run: pip install pre-commit - name: Format check run: pre-commit run --all-files - - name: Generate docs (with retry for Mojo compiler intermittent crashes) + - name: Build package (with retry for Mojo compiler intermittent crashes) run: | for attempt in 1 2 3; do - echo "=== doc attempt $attempt ===" - if pixi run doc; then - echo "=== doc succeeded on attempt $attempt ===" + echo "=== build attempt $attempt ===" + if pixi run mojo package src/decimo; then + echo "=== build succeeded on attempt $attempt ===" break fi if [ "$attempt" -eq 3 ]; then - echo "=== doc failed after 3 attempts ===" + echo "=== build failed after 3 attempts ===" exit 1 fi - echo "=== doc crashed, retrying in 5s... ===" + echo "=== build crashed, retrying in 5s... ===" sleep 5 done - - name: Build package (with retry for Mojo compiler intermittent crashes) + - name: Stage decimo.mojopkg next to tests + # `pixi run doc` documents `src/cli/calculator`, which imports + # `decimo.*`. Mojo 1.0.0b1 cannot resolve those qualified + # references when re-traversing the source tree via `-I src`, + # so the doc task uses `-I tests` against the prebuilt + # `decimo.mojopkg`. Stage it here before invoking doc. + run: cp decimo.mojopkg tests/ + - name: Generate docs (with retry for Mojo compiler intermittent crashes) run: | for attempt in 1 2 3; do - echo "=== build attempt $attempt ===" - if pixi run mojo package src/decimo; then - echo "=== build succeeded on attempt $attempt ===" + echo "=== doc attempt $attempt ===" + if pixi run doc; then + echo "=== doc succeeded on attempt $attempt ===" break fi if [ "$attempt" -eq 3 ]; then - echo "=== build failed after 3 attempts ===" + echo "=== doc failed after 3 attempts ===" exit 1 fi - echo "=== build crashed, retrying in 5s... ===" + echo "=== doc crashed, retrying in 5s... ===" sleep 5 done - name: Verify decimo.mojopkg was produced diff --git a/src/cli/calculator/evaluator.mojo b/src/cli/calculator/evaluator.mojo index ec16e249..1a4cdede 100644 --- a/src/cli/calculator/evaluator.mojo +++ b/src/cli/calculator/evaluator.mojo @@ -347,6 +347,10 @@ def final_round( Returns: A new Decimal rounded to the requested precision. + + Raises: + Error: If `precision` is invalid for the underlying rounding + operation. """ if value.is_zero(): return value.copy() @@ -374,6 +378,11 @@ def evaluate( Returns: The result as a BigDecimal, rounded to `precision` significant digits. + + Raises: + Error: If the expression cannot be tokenized, parsed, or + evaluated (e.g., syntax error, unknown identifier, division + by zero, domain error in a math function). """ var tokens = tokenize(expr) var rpn = parse_to_rpn(tokens^) diff --git a/src/cli/calculator/repl.mojo b/src/cli/calculator/repl.mojo index 00e948a1..6e0c32a8 100644 --- a/src/cli/calculator/repl.mojo +++ b/src/cli/calculator/repl.mojo @@ -82,6 +82,11 @@ def run_repl( pad: Initial zero-padding flag. delimiter: Initial digit-group delimiter. rounding_mode: Initial rounding mode. + + Raises: + Error: If the line editor cannot be initialised or an unrecoverable + I/O error occurs while reading from stdin. Per-line evaluation + errors are caught internally and do not propagate. """ var settings = Settings( precision, diff --git a/src/cli/calculator/settings.mojo b/src/cli/calculator/settings.mojo index 72481e16..82e71fc1 100644 --- a/src/cli/calculator/settings.mojo +++ b/src/cli/calculator/settings.mojo @@ -149,6 +149,10 @@ def parse_settings(input: String, mut settings: Settings) raises: Args: input: The settings string (without the leading `:`). settings: The Settings struct to modify in place. + + Raises: + Error: If a token is unknown, an option is missing its value, + or a value cannot be parsed. """ var tokens = _split_whitespace(input) var n = len(tokens) diff --git a/src/decimo/toml/parser.mojo b/src/decimo/toml/parser.mojo index 4a67cc65..baf749ff 100644 --- a/src/decimo/toml/parser.mojo +++ b/src/decimo/toml/parser.mojo @@ -951,6 +951,11 @@ struct TOMLParser: Returns: The parsed `TOMLDocument`. + + Raises: + Error: If the token stream is malformed (e.g., unexpected + tokens, duplicate keys, unterminated arrays/tables, or + invalid table headers). """ var document = TOMLDocument() var current_path = List[String]() From efb5e4097c1ddbc4c00c75efe094ac2f3a20379e Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 01:30:26 +0800 Subject: [PATCH 06/10] fix --- pixi.lock | 1224 +++++++++++++++++++++++-------------------------- pixi.toml | 9 +- tests/test.sh | 2 +- 3 files changed, 584 insertions(+), 651 deletions(-) diff --git a/pixi.lock b/pixi.lock index f8d2e5d7..67cc8917 100644 --- a/pixi.lock +++ b/pixi.lock @@ -3,205 +3,201 @@ environments: default: channels: - url: https://conda.modular.com/max/ - - url: https://conda.modular.com/max-nightly/ - 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 + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.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/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/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_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.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.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/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.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/linux-aarch64/cmarkgfm-2024.11.20-py314h51f160d_1.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.13.12-py313hd8ed1ab_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_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/cpython-3.14.4-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-48.0.0-py314hbfac26c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-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.1.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/linux-64/icu-78.3-h33c6efd_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/idna-3.11-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/importlib_resources-6.5.2-pyhd8ed1ab_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.1-pyhcf101f3_0.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/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-ha1258a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.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.7.4-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_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.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.2-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.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_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/noarch/mblack-26.3.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-1.0.0b1-release.conda - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-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.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.3-py310h6de7dc8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-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.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nh3-0.3.5-py310h8c58d24_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_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-aarch64/pcre2-10.47-hf841c20_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/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_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.13.12-hc97d973_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_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-gil-3.13.12-h4df99d1_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.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/noarch/python-gil-3.14.4-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-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.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.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-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-14.3.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.7-h7805a7d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.15.12-h2842840_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.4.1-py314ha42fa4b_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_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py314hafb4487_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-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/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.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/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_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/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/osx-arm64/backports.zstd-1.3.0-py313h48bb75e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.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.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py313hcdf3177_1.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/osx-arm64/cffi-2.0.0-py314h44086f9_1.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/osx-arm64/cmarkgfm-2024.11.20-py314hb84d1df_1.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.13.12-py313hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-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.1.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/osx-arm64/icu-78.3-hef89b57_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/idna-3.11-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/importlib_resources-6.5.2-pyhd8ed1ab_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.1-pyhcf101f3_0.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/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-h385eeb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_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.7.4-hf6b4638_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.2-h8088a28_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.52.0-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.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/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.modular.com/max/noarch/mblack-26.3.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b1-release.conda - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b1-release.conda - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-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.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.3-py310hf32026f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_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.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/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/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_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.13.12-h20e6be0_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_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/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-gil-3.13.12-h4df99d1_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.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_abi-3.14-8_cp314.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/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-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-14.3.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.7-hc5c3a1d_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.12-hbd3f8a3_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-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.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.5-py314h6c2aa35_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-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/urllib3-2.6.3-pyhd8ed1ab_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-h4818236_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.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/zstd-1.5.7-hbf9d68e_6.conda packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 - sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 - md5: a9f577daf3de00bca7c3c76c0ecbd1de + sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 + md5: 468fd3bb9e1f671d36c2cbc677e56f1d depends: - - __glibc >=2.17,<3.0.a0 - libgomp >=7.5.0 constrains: - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD - size: 28948 - timestamp: 1770939786096 + size: 28926 + timestamp: 1770939656741 - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 md5: aaa2a381ccc56eac91d63b6c1240312f @@ -232,70 +228,54 @@ packages: license_family: MIT size: 35739 timestamp: 1767290467820 -- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda - sha256: 9552afbec37c4d8d0e83a5c4c6b3c7f4b8785f935094ce3881e0a249045909ce - md5: d9e90792551a527200637e23a915dd79 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 240943 - timestamp: 1767044981366 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py313h48bb75e_0.conda - sha256: f3047ca3b41bb444b4b5a71a6eee182623192c77019746dd4685fd260becb249 - md5: 54008c5cc8928e5cb5a0f9206b829451 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda + noarch: generic + sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe + md5: 1133126d840e75287d83947be3fc3e71 depends: - - python - - python 3.13.* *_cp313 - - __osx >=11.0 - - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14 license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 244371 - timestamp: 1767045003420 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - sha256: dadec2879492adede0a9af0191203f9b023f788c18efd45ecac676d424c458ae - md5: 6c4d3597cf43f3439a51b2b13e29a4ba + size: 7533 + timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda + sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 + md5: a1b5c571a0923a205d663d8678df4792 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 constrains: - - libbrotlicommon 1.2.0 hb03c661_1 + - libbrotlicommon 1.2.0 he30d5cf_1 license: MIT license_family: MIT - size: 367721 - timestamp: 1764017371123 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - sha256: 2e21dccccd68bedd483300f9ab87a425645f6776e6e578e10e0dd98c946e1be9 - md5: b03732afa9f4f54634d94eb920dfb308 + size: 373193 + timestamp: 1764017486851 +- 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.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - 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: 359568 - timestamp: 1764018359470 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 - md5: d2ffd7602c02f2b316fd921d39876885 + size: 359854 + timestamp: 1764018178608 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c + md5: 840d8fc0d7b3209be93080bc20e07f2d depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: bzip2-1.0.6 license_family: BSD - size: 260182 - timestamp: 1771350215188 + size: 192412 + timestamp: 1771350241232 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df md5: 620b85a3f45526a8bc4d23fd78fc22f0 @@ -305,96 +285,95 @@ packages: license_family: BSD size: 124834 timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc - md5: 4492fd26db29495f0ba23f146cd5638d +- 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: 147413 - timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 - md5: 765c4d97e877cdbbb88ff33152b86125 + 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: 151445 - timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 - md5: d0616e7935acab407d1543b28c446f6f + size: 135656 + timestamp: 1776866680878 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda + sha256: 728e55b32bf538e792010308fbe55d26d02903ddc295fbe101167903a123dd6f + md5: f333c475896dbc8b15efd8f7c61154c7 depends: - - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 298357 - timestamp: 1761202966461 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - sha256: 1fa69651f5e81c25d48ac42064db825ed1a3e53039629db69f86b952f5ce603c - md5: 050374657d1c7a4f2ea443c0d0cbd9a0 + size: 318357 + timestamp: 1761203973223 +- 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.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 291376 - timestamp: 1761203583358 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 - md5: 49ee13eb9b8f44d63879c69b8a40a74b + size: 292983 + timestamp: 1761203354051 +- 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: 58510 - timestamp: 1773660086450 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 - md5: ea8a6c3256897cc31263de9f455e25d9 + size: 58872 + timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + sha256: 37a5d8b10ea3516e2c42f870c9c351b9f7b31ff48c66d83490039f417e1e5228 + md5: 2266262ce8a425ecb6523d765f79b303 depends: - - python >=3.10 - __unix - python + - python >=3.10 license: BSD-3-Clause license_family: BSD - size: 97676 - timestamp: 1764518652276 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py313h07c4f96_1.conda - sha256: 8edab14df6259d9678c83ea876a56902da44b50022cda8789c706d4d5336a4b9 - md5: d57661f0421c6fdb9a617280e633e4c8 + size: 100048 + timestamp: 1777219902525 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmarkgfm-2024.11.20-py314h51f160d_1.conda + sha256: ebaeb5b8593f0d27a9f65a76ea28b03afb0dd095f067f5bd3c5008f277e23681 + md5: bfcfa0592390fbc8311b4f9181138f23 depends: - - __glibc >=2.17,<3.0.a0 - cffi >=1.0.0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 142385 - timestamp: 1760363028602 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py313hcdf3177_1.conda - sha256: 22ef41f6533fb1241097d4e9db11bbc0191b8a9fd0543cd85dcb56a197191b34 - md5: 49f95432e803116f993f2e680a88bdf3 + size: 135485 + timestamp: 1760363090161 +- 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.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 115969 - timestamp: 1760363255005 + size: 115970 + timestamp: 1760363189413 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -404,45 +383,43 @@ packages: license_family: BSD size: 27011 timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda noarch: generic - sha256: 7636809bda35add7af66cda1fee156136fcba0a1e24bbef1d591ee859df755a8 - md5: 9a4b8a37303b933b847c14a310f0557b + sha256: 40dc224f2b718e5f034efd2332bc315a719063235f63673468d26a24770094ee + md5: f111d4cfaf1fe9496f386bc98ae94452 depends: - - python >=3.13,<3.14.0a0 - - python_abi * *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 license: Python-2.0 - size: 48648 - timestamp: 1770270374831 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda - sha256: 553f4ee18ad755d690ad63fa8e00d89598ecc4945ec046a8af808ddee5bb1ca0 - md5: 964f25e322b16cae073da8f5b7adf123 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.14 + size: 49809 + timestamp: 1775614256655 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-48.0.0-py314hbfac26c_0.conda + sha256: 7ae2112207338f759632ae4fdb1febf93149f9d074cd3f701de5a2967719cf66 + md5: 4c15184e771e73b89928eb3d9a7e8106 + depends: + - cffi >=2.0 - libgcc >=14 - - openssl >=3.5.5,<4.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - openssl >=3.5.6,<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: 1718868 - timestamp: 1770772833949 -- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 - md5: ce96f2f470d39bd96ce03945af92e280 + size: 1969324 + timestamp: 1777966101392 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda + sha256: 3af801577431af47c0b72a82bb93c654f03072dece0a2a6f92df8a6802f52a22 + md5: a4b6b82427d15f0489cef0df2d82f926 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 - libglib >=2.86.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 - libexpat >=2.7.3,<3.0a0 license: AFL-2.1 OR GPL-2.0-or-later - size: 447649 - timestamp: 1764536047944 + size: 480416 + timestamp: 1764536098891 - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e md5: d6bd3cd217e62bbd7efe67ff224cd667 @@ -481,26 +458,6 @@ packages: license_family: MIT size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a - md5: c80d8a3b84358cb967fa81e7075fbc8a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - size: 12723451 - timestamp: 1773822285671 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 - md5: f1182c91c0de31a7abd40cedf6a5ebef - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 12361647 - timestamp: 1773822915649 - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda sha256: 54c80a4ca6e6a19b4bb89c829f757d0de00362a3bfa4647517d2ebd519717f0f md5: 563a022fc58cf7a200c35cb3fee07a6b @@ -512,15 +469,16 @@ packages: license_family: APACHE size: 27972 timestamp: 1770237711404 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 - md5: 53abe63df7e10a6ba605dc5f9f961d36 +- 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: 50721 - timestamp: 1760286526795 + size: 59038 + timestamp: 1776947141407 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 md5: 080594bf4493e6bae2607e65390c520a @@ -532,18 +490,18 @@ packages: license_family: APACHE size: 34387 timestamp: 1773931568510 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 - md5: c85c76dc67d75619a92f51dfbce06992 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a + md5: 0ba6225c279baf7ea9473a62ea0ec9ae depends: - - python >=3.9 + - python >=3.10 - zipp >=3.1.0 constrains: - - importlib-resources >=6.5.2,<6.5.3.0a0 + - importlib-resources >=7.1.0,<7.1.1.0a0 license: Apache-2.0 license_family: APACHE - size: 33781 - timestamp: 1736252433366 + size: 34809 + timestamp: 1776068839274 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 md5: d59568bad316413c89831456e691de29 @@ -555,17 +513,17 @@ packages: license_family: MIT size: 14831 timestamp: 1767294269456 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.1-pyhcf101f3_0.conda - sha256: 49c3e2e9aa4930734badfcbb31543406ed1b5531cb833f595cf57baf628dea7d - md5: 5ed60de12f1673398943262371667f79 +- 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: 15368 - timestamp: 1773131463776 + size: 16222 + timestamp: 1776862415793 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.4.0-pyhcf101f3_1.conda sha256: 6a91447b3bb4d7ae94cc0d77ed12617796629aee11111efe7ea43cbd0e113bda md5: aa83cc08626bf6b613a3103942be8951 @@ -649,20 +607,18 @@ packages: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 + md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 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 + size: 129048 + timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba + md5: d9ca108bd680ea86a963104b6b3e95ca 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 @@ -671,8 +627,8 @@ packages: - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT - size: 1386730 - timestamp: 1769769569681 + size: 1517436 + timestamp: 1769773395215 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed md5: e446e1822f4da8e5080a9de93474184d @@ -686,39 +642,37 @@ packages: license_family: MIT size: 1160828 timestamp: 1769770119811 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 - md5: 12bd9a3f089ee6c9266a37dab82afabd +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 + md5: a21644fc4a83da26452a718dc9468d5f depends: - - __glibc >=2.17,<3.0.a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - binutils_impl_linux-64 2.45.1 + - binutils_impl_linux-aarch64 2.45.1 license: GPL-3.0-only license_family: GPL - size: 725507 - timestamp: 1770267139900 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.1-h55c6f16_0.conda - sha256: 3c8142cdd3109c250a926c492ec45bc954697b288e5d1154ada95272ffa21be8 - md5: 7a290d944bc0c481a55baf33fa289deb + size: 875596 + timestamp: 1774197520746 +- 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: 570281 - timestamp: 1773203613980 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 - md5: c277e0a4d549b03ac1e9d6cbbe3d017b + size: 569359 + timestamp: 1778191546305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 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 + size: 148125 + timestamp: 1738479808948 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 md5: 44083d2d2c2025afca315c7a172eab2b @@ -730,39 +684,37 @@ packages: license_family: BSD size: 107691 timestamp: 1738479560845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 - md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda + sha256: 206c422a7f4b462d1dc17d558f0299088d0992bd3309ae83f5440fcc4f130602 + md5: 3bacd6171f0a3f8fddd06c3d5ae01955 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.4.* + - expat 2.8.0.* license: MIT license_family: MIT - size: 76798 - timestamp: 1771259418166 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf - md5: a92e310ae8dfc206ff449f362fc4217f + size: 76996 + timestamp: 1777846096032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c + md5: 65466e82c09e888ca7560c11a97d5450 depends: - __osx >=11.0 constrains: - - expat 2.7.4.* + - expat 2.8.0.* license: MIT license_family: MIT - size: 68199 - timestamp: 1771260020767 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 - md5: a360c33a5abe61c07959e449fa1453eb + size: 68789 + timestamp: 1777846180142 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 + md5: 2f364feefb6a7c00423e80dcb12db62a depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: MIT license_family: MIT - size: 58592 - timestamp: 1769456073053 + size: 55952 + timestamp: 1769456078358 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 md5: 43c04d9cb46ef176bb2a4c77e324d599 @@ -772,83 +724,76 @@ packages: license_family: MIT size: 40979 timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 - md5: 0aa00f03f9e39fb9876085dee11a85d4 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 + md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a depends: - - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 he0feb66_18 + - libgomp 15.2.0 h8acb6b2_19 + - libgcc-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1041788 - timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce - md5: bb26456332b07f68bf3b7622ed71c0da + size: 622462 + timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda + sha256: 050285afdb7bd98b1b8fb052af9da31fafde586a49d3b56dd33d5338b2d0e411 + md5: 16d72f76bf6fead4a29efb2fede0a06b depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - pcre2 >=10.47,<10.48.0a0 + - libffi >=3.5.2,<3.6.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later - size: 4398701 - timestamp: 1771863239578 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 - md5: 239c5e9546c38a1e884d69effcf4c882 - depends: - - __glibc >=2.17,<3.0.a0 + size: 4946648 + timestamp: 1778508920982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 + md5: c5e8a379c4a2ec2aea4ba22758c001d9 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 603262 - timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f - md5: 915f5995e94f60e9a4826e0b0920ee88 + size: 587387 + timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 + md5: 5a86bf847b9b926f3a4f203339748d78 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-only - size: 790176 - timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb - md5: c7c83eecbb72d88b940c249af56c8b17 + size: 791226 + timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c + md5: 76298a9e6d71ee6e832a8d0d7373b261 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD - size: 113207 - timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e - md5: 009f0d956d7bfb00de86901d16e486c7 + size: 126102 + timestamp: 1775828008518 +- 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.2.* + - xz 5.8.3.* license: 0BSD - size: 92242 - timestamp: 1768752982486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 - md5: 2c21e66f50753a083cbe6b80f38268fa + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 + md5: 7b9813e885482e3ccb1fa212b86d7fd0 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-2-Clause license_family: BSD - size: 92400 - timestamp: 1769482286018 + size: 114056 + timestamp: 1769482343003 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 md5: 57c4be259f5e0b99a5983799a228ae55 @@ -858,15 +803,14 @@ packages: license_family: BSD size: 73690 timestamp: 1769482560514 -- 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/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + sha256: d6112f3a7e7ffcd726ce653724f979b528cb8a19675fc06016a5d360ef94e9a4 + md5: 9e1fe4202543fa5b6ab58dbf12d34ced depends: - libgcc >=14 - - __glibc >=2.17,<3.0.a0 license: ISC - size: 277661 - timestamp: 1772479381288 + size: 272649 + timestamp: 1772479384085 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 md5: 7cc5247987e6d115134ebab15186bc13 @@ -875,82 +819,74 @@ packages: license: ISC size: 248039 timestamp: 1772479570912 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 - md5: fd893f6a3002a635b5e50ceb9dd2c0f4 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda + sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 + md5: 2ec1119217d8f0d086e9a62f3cb0e5ea depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing - size: 951405 - timestamp: 1772818874251 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c - md5: f6233a3fddc35a2ec9f617f79d6f3d71 + size: 955361 + timestamp: 1777986487553 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 + md5: 6681822ea9d362953206352371b6a904 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing - size: 918420 - timestamp: 1772819478684 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e - md5: 1b08cd684f34175e4514474793d44bcb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_18 + size: 920047 + timestamp: 1777987051643 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e + md5: 543fbc8d71f2a0baf04cf88ce96cb8bb + depends: + - libgcc 15.2.0 h8acb6b2_19 constrains: - - libstdcxx-ng ==15.2.0=*_18 + - libstdcxx-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 5852330 - timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 + size: 5546559 + timestamp: 1778268777463 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda + sha256: 7d427edf58c702c337bf62bc90f355b7fc374a65fd9f70ea7a490f13bb76b1b9 + md5: a0b5de740d01c390bdbb46d7503c9fab depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD - size: 40311 - timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + size: 43567 + timestamp: 1775052485727 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f + md5: 502006882cf5461adced436e410046d1 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 + size: 69833 + timestamp: 1774072605429 +- 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.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other - size: 46438 - timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e - md5: 5b5203189eb668f042ac2b0826244964 + 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: 64736 - timestamp: 1754951288511 + size: 69017 + timestamp: 1778169663339 - conda: https://conda.modular.com/max/noarch/mblack-26.3.0-release.conda noarch: python sha256: c7c36d5b223862acffaaacdfc6f672ca198a046a66f4a956ca57933123fb93b2 @@ -975,17 +911,17 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b1-release.conda - sha256: a8f36a83ece187307d7d78c152828eac58edb002d515de2bcbe9f5a19388b70c - md5: 11bdf0256d179b89dc00ca4150c6963c +- conda: https://conda.modular.com/max/linux-aarch64/mojo-1.0.0b1-release.conda + sha256: bcc1b91f2d39ab25e430d2de0c552b6f5afe03c13d8d726c4b2aca4ce5e0901e + md5: c6970314e455e0c04eee0be160adbebb depends: - python >=3.10 - mojo-compiler ==1.0.0b1 - mblack ==26.3.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 94106548 - timestamp: 1777595784229 + size: 92647635 + timestamp: 1777595798392 - conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b1-release.conda sha256: 2980b825e3eedb153f68f74edeaae6a7b819912c3eb6e49f1eed7d25f883e050 md5: b5f2c6b04a9e2bbe199fef1ea5677014 @@ -997,14 +933,14 @@ packages: license: LicenseRef-Modular-Proprietary size: 83375027 timestamp: 1777596028766 -- conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b1-release.conda - sha256: 706c7f8e2be740dda8039bf96182b578bfbbd9220ca1a7f762e1f82acc4eb784 - md5: 2fc6038c3837e50bb855bcf7f930c1c9 +- conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-1.0.0b1-release.conda + sha256: 6d6973cc34960597e786ad0f0ed0eba2c005d08eeefd37df53d2cd489ee2acd6 + md5: 6b81a95a59f729be52dc9685210165e5 depends: - mojo-python ==1.0.0b1 license: LicenseRef-Modular-Proprietary - size: 89421276 - timestamp: 1777595833113 + size: 86382462 + timestamp: 1777595795606 - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b1-release.conda sha256: 3e0d6e6e814cb39d14d24234eb8f2ac6524379ea0a9c398a54e77598844e96d6 md5: fe08c02512b02563a0b878eeb32a684b @@ -1022,16 +958,16 @@ packages: license: LicenseRef-Modular-Proprietary size: 23114 timestamp: 1777594699418 -- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda - sha256: 449609f0d250607a300754474350a3b61faf45da183d3071e9720e453c765b8a - md5: 32f78e9d06e8593bc4bbf1338da06f5f +- 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: 69210 - timestamp: 1764487059562 + size: 71254 + timestamp: 1775762492525 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 md5: e9c622e0d00fa24a6292279af3ab6d06 @@ -1041,43 +977,41 @@ packages: license_family: MIT size: 11766 timestamp: 1745776666688 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 - md5: 47e340acb35de30501a76c7c799c41d7 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca + md5: b2a43456aa56fe80c2477a5094899eff depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: X11 AND BSD-3-Clause - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae + size: 960036 + timestamp: 1777422174534 +- 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: 797030 - timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.3-py310h6de7dc8_0.conda + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nh3-0.3.5-py310h8c58d24_1.conda noarch: python - sha256: dcc0eee49226ef2f8f58de541a1b0ec492f4f0928ec43b1c26bf498511c363b1 - md5: 5abaf4ccde7924f6f49b36e5fca892a1 + sha256: 6ee2009d1ab2ded386b773902109892343993d1c0c4778baa76d3936f1d01d45 + md5: 62f101243b4d2a7abedbf4f5c9dd9681 depends: - python - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - _python_abi3_support 1.* - cpython >=3.10 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 678551 - timestamp: 1771078193635 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.3-py310hf32026f_0.conda + size: 674731 + timestamp: 1777219098394 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.5-py310h3b8a9b8_1.conda noarch: python - sha256: 4b2af5ca6f5d578f2eceaf8025e8bd80d3f7e5f932fa5ff2f2b4a039aef8d784 - md5: 2766e89e8aa0a79626a735d4afdeefcd + sha256: 5932e04c48ab4e08452ea0e681969706d8b1d8574f3147a39577bec02eac38a7 + md5: 6337a614ffaf7f9383968196cf100601 depends: - python - __osx >=11.0 @@ -1087,70 +1021,68 @@ packages: - __osx >=11.0 license: MIT license_family: MIT - size: 634553 - timestamp: 1771078287944 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c - md5: f61eb8cd60ff9057122a3d338b99c00f + size: 631222 + timestamp: 1777219210592 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda + sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 + md5: 3b129669089e4d6a5c6871dbb4669b99 depends: - - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3164551 - timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 - md5: f4f6ad63f98f64191c3e77c5f5f29d76 + size: 3706406 + timestamp: 1775589602258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea + md5: 25dcccd4f80f1638428613e0d7c9b4e1 depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 3104268 - timestamp: 1769556384749 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 - md5: b76541e68fea4d511b1ac46a28dcd2c6 + size: 3106008 + timestamp: 1775587972483 +- 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: 72010 - timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - sha256: 29ea20d0faf20374fcd61c25f6d32fb8e9a2c786a7f1473a0c3ead359470fbe1 - md5: 2908273ac396d2cd210a8127f5f1c0d6 + 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: 53739 - timestamp: 1769677743677 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff - md5: 7a3bff861a6583f1889021facefc08b1 + size: 56559 + timestamp: 1777271601895 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 + md5: 1a30c42e32ca0ea216bd0bfe6f842f0b depends: - - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD - size: 1222481 - timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - sha256: 0289f0a38337ee201d984f8f31f11f6ef076cfbbfd0ab9181d12d9d1d099bf46 - md5: 82c1787f2a65c0155ef9652466ee98d6 + size: 1166552 + timestamp: 1763655534263 +- 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: 25646 - timestamp: 1773199142345 + size: 25862 + timestamp: 1775741140609 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 md5: 12c566707c80111f9799308d9e265aef @@ -1161,15 +1093,15 @@ packages: license_family: BSD size: 110100 timestamp: 1733195786147 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a - md5: 6b6ece66ebcae2d5f326c77ef2c5a066 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 16c18772b340887160c79a6acc022db0 depends: - - python >=3.9 + - python >=3.10 license: BSD-2-Clause license_family: BSD - size: 889287 - timestamp: 1750615908735 + size: 893031 + timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 md5: d4582021af437c931d7d77ec39007845 @@ -1190,71 +1122,73 @@ packages: license_family: BSD size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda build_number: 100 - sha256: 8a08fe5b7cb5a28aa44e2994d18dbf77f443956990753a4ca8173153ffb6eb56 - md5: 4c875ed0e78c2d407ec55eadffb8cf3d + sha256: d29da77f75e8f9184cc9502d5c44be87397291a9e88819d5418322a173f76303 + md5: 3cfbe780f0f51cc8cba41db9f8a28bfe depends: - - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.5,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - liblzma >=5.8.2,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libuuid >=2.41.3,<3.0a0 - - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libuuid >=2.42,<3.0a0 + - libzlib >=1.3.2,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 + - 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: 37364553 - timestamp: 1770272309861 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + size: 37409899 + timestamp: 1775613674766 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda build_number: 100 - sha256: 9a4f16a64def0853f0a7b6a7beb40d498fd6b09bee10b90c3d6069b664156817 - md5: 179c0f5ae4f22bc3be567298ed0b17b9 + sha256: 27e7d6cbe021f37244b643f06a98e46767255f7c2907108dd3736f042757ddad + md5: e1bc5a3015a4bbeb304706dba5a32b7f depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.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.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.2,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 + - 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: 12770674 - timestamp: 1770272314517 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_0.conda - sha256: 195e483a12bcec40b817f4001d4d4b8ea1cb2de66a62aeabfff6e32e29b3f407 - md5: dbbb75958b0b03842dcf9be2f200fc10 + size: 13533346 + timestamp: 1775616188373 + 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 >=19.0 + - packaging >=24.0 - pyproject_hooks - - python >=3.10 - tomli >=1.1.0 + - python constrains: - build <0 license: MIT license_family: MIT - size: 26687 - timestamp: 1767988747352 + 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 @@ -1266,41 +1200,40 @@ packages: license_family: APACHE size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - sha256: f306304235197434494355351ac56020a65b7c5c56ff10ca1ed53356d575557a - md5: 3d92938d5b83c49162ade038aab58a59 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda + sha256: 36ff7984e4565c85149e64f8206303d412a0652e55cf806dcb856903fa056314 + md5: e4e60721757979d01d3964122f674959 depends: - - cpython 3.13.12.* - - python_abi * *_cp313 + - cpython 3.14.4.* + - python_abi * *_cp314 license: Python-2.0 - size: 48618 - timestamp: 1770270436560 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + size: 49806 + timestamp: 1775614307464 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 constrains: - - python 3.13.* *_cp313 + - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 7002 - timestamp: 1752805902938 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda noarch: python - sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 - md5: 082985717303dab433c976986c674b35 + sha256: afdff66cb54e22d0d2c682731e08bb8f319dfd93f3cdcff4a4640cb5a8ae2460 + md5: 130d781798bb24a0b86290e65acd50d8 depends: - python - - libgcc >=14 - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - 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: 212585 + timestamp: 1771716963309 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda noarch: python sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772 @@ -1316,17 +1249,16 @@ packages: license_family: BSD size: 191641 timestamp: 1771717073430 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 - md5: d7d95fc8287ea7bf33e0e7116d2b95ec +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 + md5: 3d49cad61f829f4f0e0611547a9cda12 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL - size: 345073 - timestamp: 1765813471974 + size: 357597 + timestamp: 1765815673644 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 md5: f8381319127120ce51e081dce4865cf4 @@ -1350,22 +1282,22 @@ packages: license_family: APACHE size: 17481 timestamp: 1734339765256 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 - md5: c65df89a0b2e321045a9e01d1337b182 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + sha256: 4487fdb341537e2df47159ed8e546add99080974c52d5b2dc2a710910619115a + md5: a5985537dab1ba7034b5ff4ea22e2fa9 depends: - python >=3.10 - - certifi >=2017.4.17 + - certifi >=2023.5.7 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - urllib3 >=1.21.1,<3 + - urllib3 >=1.26,<3 - python constrains: - - chardet >=3.0.2,<6 + - chardet >=3.0.2,<8 license: Apache-2.0 license_family: APACHE - size: 63602 - timestamp: 1766926974520 + size: 68658 + timestamp: 1778534036810 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 md5: 66de8645e324fda0ea6ef28c2f99a2ab @@ -1385,9 +1317,9 @@ packages: license_family: APACHE size: 38028 timestamp: 1733921806657 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 - md5: 7a6289c50631d620652f5045a63eb573 +- 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 @@ -1396,46 +1328,47 @@ packages: - python license: MIT license_family: MIT - size: 208472 - timestamp: 1771572730357 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.7-h7805a7d_1.conda + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.15.12-h2842840_0.conda noarch: python - sha256: 2985cfff61368323db477c2a0d7f100a57f6cb34aafec51ae96b6fc409d9090f - md5: f5678c1a929d9efe3c2397675ae90a3c + sha256: 2a02980403d4f151216de7d6220a2ce8487dafd3b5ebe478728c04fac1af4f6e + md5: 39880da48590e92bb1ef6661c132d124 depends: - python - libgcc >=14 - - __glibc >=2.17,<3.0.a0 constrains: - __glibc >=2.17 license: MIT - size: 9220190 - timestamp: 1774012576023 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.7-hc5c3a1d_1.conda + license_family: MIT + size: 8898060 + timestamp: 1778119389286 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.12-hbd3f8a3_0.conda noarch: python - sha256: b8e869469607bf00dc80ad920bffe96adc9b21d22e940ffeff71a664d35ef9b7 - md5: c8590d44f44c1406844b1e10795153e5 + sha256: 91992a557456cbe9980e8ffb0f0d1200f65f741adeefc7ecf568d1935690a7bc + md5: 7151a0851207b88c0031f388a7825e9b depends: - python - __osx >=11.0 constrains: - __osx >=11.0 license: MIT - size: 8432798 - timestamp: 1774012820989 -- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py313h78bf25f_0.conda - sha256: 43ea89b53cbede879e57ac9dd20153c5cd2bb9575228e7faf5a8764aa6c201b7 - md5: 013a7d73eaef154f0dc5e415ffa8ff87 + license_family: MIT + size: 8485007 + timestamp: 1778119519471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.4.1-py314ha42fa4b_0.conda + sha256: 6e536dc5157dd21a1cdfab4c0ee737aca3a942865694cb87d01b78515cae036d + md5: 52f075b52b3bae9ecd903e984c7417bc depends: - cryptography >=2.0 - dbus - jeepney >=0.6 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 32933 - timestamp: 1763045369115 + size: 34275 + timestamp: 1763046783366 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -1446,19 +1379,18 @@ packages: license_family: MIT size: 18455 timestamp: 1753199211006 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac - md5: cffd3bdd58090148f4cfcd831f4b26ab +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda + sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 + md5: 7fc6affb9b01e567d2ef1d05b84aa6ed depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 constrains: - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD - size: 3301196 - timestamp: 1769460227866 + size: 3368666 + timestamp: 1769464148928 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 md5: a9d86bc62f39b94c4661716624eb21b0 @@ -1469,49 +1401,49 @@ packages: license_family: BSD size: 3127137 timestamp: 1769460817696 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8 - md5: 72e780e9aa2d0a3295f59b1874e3768b +- 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: 21453 - timestamp: 1768146676791 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda - sha256: 6006d4e5a6ff99be052c939e43adee844a38f2dc148f44a7c11aa0011fd3d811 - md5: 82da2dcf1ea3e298f2557b50459809e0 + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py314hafb4487_0.conda + sha256: a7096330909a4b3345cbaecea099613929aae52900310209e0e27e616b550e4c + md5: 6fa496cc0b64d496a6a755c9de72f17b depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 878109 - timestamp: 1765458900582 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda - sha256: a8130a361b7bc21190836ba8889276cc263fcb09f52bf22efcaed1de98179948 - md5: 67a85c1b5c17124eaf9194206afd5159 + size: 914247 + timestamp: 1774359407535 +- 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.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - 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: 877647 - timestamp: 1765836696426 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 - md5: 019a7385be9af33791c989871317e1ed + size: 910845 + timestamp: 1774358965067 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + sha256: dfb681579be59c2e790c95f7f49b7529a9b0511d6385ad276e3c8988cbd54d2c + md5: 4bada6a6d908a27262af8ebddf4f7492 depends: - - python >=3.9 + - python >=3.10 + - python license: BSD-3-Clause license_family: BSD - size: 110051 - timestamp: 1733367480074 + size: 115165 + timestamp: 1778074251714 - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb md5: 901a86453fa6183e914b937643619a03 @@ -1548,9 +1480,9 @@ packages: license: LicenseRef-Public-Domain size: 119135 timestamp: 1767016325805 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a - md5: 9272daa869e03efe68833e3dc7a02130 +- 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 @@ -1559,21 +1491,20 @@ packages: - python >=3.10 license: MIT license_family: MIT - size: 103172 - timestamp: 1767817860341 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6 - md5: 755b096086851e1193f3b10347415d7c + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda + sha256: 32f77d565687a8241ebfb66fe630dcb197efc84f6a8b59df8260b1191b7deb2c + md5: ac79d51c73c8fbe6ef6e9067191b7f1a 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 + - krb5 >=1.22.2,<1.23.0a0 license: MPL-2.0 license_family: MOZILLA - size: 311150 - timestamp: 1772476812121 + size: 350773 + timestamp: 1772476818466 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868 md5: e85dcd3bde2b10081cdcaeae15797506 @@ -1586,26 +1517,25 @@ packages: license_family: MOZILLA size: 245246 timestamp: 1772476886668 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae - md5: 30cd29cb87d819caead4d55184c1d115 +- 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: 24194 - timestamp: 1764460141901 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + size: 24461 + timestamp: 1776131454755 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 + md5: c3655f82dcea2aa179b291e7099c1fcc depends: - - __glibc >=2.17,<3.0.a0 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD - size: 601375 - timestamp: 1764777111296 + size: 614429 + timestamp: 1764777145593 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 md5: ab136e4c34e97f34fb621d2592a393d8 diff --git a/pixi.toml b/pixi.toml index f2cf3165..e3ffad1a 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,6 +1,6 @@ [workspace] authors = ["ZHU Yuhao (朱宇浩) "] -channels = ["https://conda.modular.com/max", "https://conda.modular.com/max-nightly", "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" @@ -90,7 +90,9 @@ fetch = """git clone https://github.com/forfudan/argmojo.git temp/argmojo 2>/dev bcli = "clear && pixi run buildcli" # Uncomment the following lines if we build the CLI package with # local clone of argmojo -buildcli = """pixi run mojo package src/decimo -o temp/decimo.mojopkg \ +buildcli = """pixi run fetch \ +&& mkdir -p temp \ +&& pixi run mojo package src/decimo -o temp/decimo.mojopkg \ && pixi run mojo package temp/argmojo/src/argmojo -o temp/argmojo.mojopkg \ && pixi run mojo build -I temp -I src/cli -o decimo src/cli/main.mojo""" # buildcli = """pixi run mojo build -I src -I src/cli -o decimo src/cli/main.mojo""" @@ -99,7 +101,8 @@ testcli = "pixi run buildcli && bash tests/test.sh cli" # python bindings (mojo4py) bpy = "clear && pixi run buildpy" -buildpy = """pixi run mojo build python/decimo_module.mojo \ +buildpy = """pixi run mojo package src/decimo -o tests/decimo.mojopkg \ +&& pixi run mojo build python/decimo_module.mojo \ --emit shared-lib -I tests -o python/src/decimo/_decimo.so""" testpy = "pixi run buildpy && pixi run python python/tests/test_decimo.py" tpy = "clear && pixi run testpy" diff --git a/tests/test.sh b/tests/test.sh index 75ec426a..bfb3d759 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -84,7 +84,7 @@ run_bigfloat() { for f in tests/bigfloat/*.mojo; do echo "=== $f ===" TMPBIN=$(mktemp /tmp/decimo_test_bigfloat_XXXXXX) - pixi run mojo build -I src --debug-level=full \ + pixi run mojo build -I tests --debug-level=full \ -Xlinker -L./"$WRAPPER_DIR" -Xlinker -ldecimo_gmp_wrapper \ -o "$TMPBIN" "$f" DYLD_LIBRARY_PATH="./$WRAPPER_DIR" LD_LIBRARY_PATH="./$WRAPPER_DIR" "$TMPBIN" From b2776ffac777767f4ca35057fb4af5f8502c3b91 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 01:37:00 +0800 Subject: [PATCH 07/10] update --- pixi.lock | 574 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ pixi.toml | 4 +- 2 files changed, 576 insertions(+), 2 deletions(-) diff --git a/pixi.lock b/pixi.lock index 67cc8917..fe7c824d 100644 --- a/pixi.lock +++ b/pixi.lock @@ -8,6 +8,101 @@ environments: 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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.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/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.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/linux-64/cffi-2.0.0-py314h4a8dc5f_1.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/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.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/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/noarch/docutils-0.22.4-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.1.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/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/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/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-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/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.3.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b1-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-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.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/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.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.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.4-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-gil-3.14.4-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_2.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-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/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.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/noarch/six-1.17.0-pyhe01879c_1.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/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-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/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -186,6 +281,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + size: 28948 + timestamp: 1770939786096 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 @@ -237,6 +345,21 @@ packages: license: BSD-3-Clause AND MIT AND EPL-2.0 size: 7533 timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 + md5: 8910d2c46f7e7b519129f486e0fe927a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - libbrotlicommon 1.2.0 hb03c661_1 + license: MIT + license_family: MIT + size: 367376 + timestamp: 1764017265553 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 md5: a1b5c571a0923a205d663d8678df4792 @@ -267,6 +390,16 @@ packages: 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 + 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-aarch64/bzip2-1.0.8-h4777abc_9.conda sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c md5: 840d8fc0d7b3209be93080bc20e07f2d @@ -301,6 +434,20 @@ packages: license: ISC size: 135656 timestamp: 1776866680878 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + md5: cf45f4278afd6f4e6d03eda0f435d527 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - pycparser + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + size: 300271 + timestamp: 1761203085220 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda sha256: 728e55b32bf538e792010308fbe55d26d02903ddc295fbe101167903a123dd6f md5: f333c475896dbc8b15efd8f7c61154c7 @@ -348,6 +495,19 @@ packages: license_family: BSD size: 100048 timestamp: 1777219902525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + md5: 23985f6de5f68e3465807e1fbbc98f30 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.0.0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + size: 144534 + timestamp: 1760363043706 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmarkgfm-2024.11.20-py314h51f160d_1.conda sha256: ebaeb5b8593f0d27a9f65a76ea28b03afb0dd095f067f5bd3c5008f277e23681 md5: bfcfa0592390fbc8311b4f9181138f23 @@ -393,6 +553,22 @@ packages: license: Python-2.0 size: 49809 timestamp: 1775614256655 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py314h7fe84b3_0.conda + sha256: 6ce32ae5829d21d3bca259f7e022d8a467d778ae1db548570a097d497c88012e + md5: 95d37edaeb19cc94ef1567a7e2abc1c9 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=2.0 + - libgcc >=14 + - openssl >=3.5.6,<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 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-48.0.0-py314hbfac26c_0.conda sha256: 7ae2112207338f759632ae4fdb1febf93149f9d074cd3f701de5a2967719cf66 md5: 4c15184e771e73b89928eb3d9a7e8106 @@ -408,6 +584,19 @@ packages: license_family: BSD size: 1969324 timestamp: 1777966101392 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 + md5: ce96f2f470d39bd96ce03945af92e280 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.86.2,<3.0a0 + - libexpat >=2.7.3,<3.0a0 + license: AFL-2.1 OR GPL-2.0-or-later + size: 447649 + timestamp: 1764536047944 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda sha256: 3af801577431af47c0b72a82bb93c654f03072dece0a2a6f92df8a6802f52a22 md5: a4b6b82427d15f0489cef0df2d82f926 @@ -607,6 +796,15 @@ packages: 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-aarch64/keyutils-1.6.3-h86ecc28_0.conda sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 @@ -615,6 +813,21 @@ packages: license: LGPL-2.1-or-later size: 129048 timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 + 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 + license: MIT + license_family: MIT + size: 1386730 + timestamp: 1769769569681 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba md5: d9ca108bd680ea86a963104b6b3e95ca @@ -642,6 +855,18 @@ packages: license_family: MIT size: 1160828 timestamp: 1769770119811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 + 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-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 md5: a21644fc4a83da26452a718dc9468d5f @@ -662,6 +887,18 @@ packages: license_family: Apache size: 569359 timestamp: 1778191546305 +- 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/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 md5: fb640d776fc92b682a14e001980825b1 @@ -684,6 +921,18 @@ packages: license_family: BSD size: 107691 timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 + md5: a3b390520c563d78cc58974de95a03e5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.0.* + license: MIT + license_family: MIT + size: 77241 + timestamp: 1777846112704 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda sha256: 206c422a7f4b462d1dc17d558f0299088d0992bd3309ae83f5440fcc4f130602 md5: 3bacd6171f0a3f8fddd06c3d5ae01955 @@ -706,6 +955,16 @@ packages: license_family: MIT size: 68789 timestamp: 1777846180142 +- 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/linux-aarch64/libffi-3.5.2-h376a255_0.conda sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 md5: 2f364feefb6a7c00423e80dcb12db62a @@ -724,6 +983,19 @@ packages: 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: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 + 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-aarch64/libgcc-15.2.0-h8acb6b2_19.conda sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a @@ -736,6 +1008,21 @@ packages: license_family: GPL size: 622462 timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + sha256: 33eb5d5310a5c2c0a4707a0afa644801c2e08c8f70c45e1f62f354116dfe0970 + md5: 17d484ab9c8179c6a6e5b7dbb5065afc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - 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 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda sha256: 050285afdb7bd98b1b8fb052af9da31fafde586a49d3b56dd33d5338b2d0e411 md5: 16d72f76bf6fead4a29efb2fede0a06b @@ -750,6 +1037,15 @@ packages: license: LGPL-2.1-or-later size: 4946648 timestamp: 1778508920982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 603817 + timestamp: 1778268942614 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 md5: c5e8a379c4a2ec2aea4ba22758c001d9 @@ -757,6 +1053,15 @@ packages: license_family: GPL size: 587387 timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + size: 790176 + timestamp: 1754908768807 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 md5: 5a86bf847b9b926f3a4f203339748d78 @@ -765,6 +1070,17 @@ packages: license: LGPL-2.1-only size: 791226 timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + size: 113478 + timestamp: 1775825492909 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c md5: 76298a9e6d71ee6e832a8d0d7373b261 @@ -785,6 +1101,16 @@ packages: 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 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + size: 92400 + timestamp: 1769482286018 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 md5: 7b9813e885482e3ccb1fa212b86d7fd0 @@ -803,6 +1129,15 @@ packages: license_family: BSD size: 73690 timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 + md5: 7af961ef4aa2c1136e11dd43ded245ab + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: ISC + size: 277661 + timestamp: 1772479381288 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda sha256: d6112f3a7e7ffcd726ce653724f979b528cb8a19675fc06016a5d360ef94e9a4 md5: 9e1fe4202543fa5b6ab58dbf12d34ced @@ -819,6 +1154,16 @@ packages: license: ISC size: 248039 timestamp: 1772479570912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d + md5: 7dc38adcbf71e6b38748e919e16e0dce + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing + size: 954962 + timestamp: 1777986471789 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 md5: 2ec1119217d8f0d086e9a62f3cb0e5ea @@ -837,6 +1182,18 @@ packages: license: blessing size: 920047 timestamp: 1777987051643 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_19 + constrains: + - libstdcxx-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 5852044 + timestamp: 1778269036376 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e md5: 543fbc8d71f2a0baf04cf88ce96cb8bb @@ -848,6 +1205,16 @@ packages: license_family: GPL size: 5546559 timestamp: 1778268777463 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 + md5: 38ffe67b78c9d4de527be8315e5ada2c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 40297 + timestamp: 1775052476770 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda sha256: 7d427edf58c702c337bf62bc90f355b7fc374a65fd9f70ea7a490f13bb76b1b9 md5: a0b5de740d01c390bdbb46d7503c9fab @@ -857,6 +1224,17 @@ packages: license_family: BSD size: 43567 timestamp: 1775052485727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + size: 63629 + timestamp: 1774072609062 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f md5: 502006882cf5461adced436e410046d1 @@ -911,6 +1289,17 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 +- conda: https://conda.modular.com/max/linux-64/mojo-1.0.0b1-release.conda + sha256: a8f36a83ece187307d7d78c152828eac58edb002d515de2bcbe9f5a19388b70c + md5: 11bdf0256d179b89dc00ca4150c6963c + depends: + - python >=3.10 + - mojo-compiler ==1.0.0b1 + - mblack ==26.3.0 + - jupyter_client >=8.6.2,<8.7 + license: LicenseRef-Modular-Proprietary + size: 94106548 + timestamp: 1777595784229 - conda: https://conda.modular.com/max/linux-aarch64/mojo-1.0.0b1-release.conda sha256: bcc1b91f2d39ab25e430d2de0c552b6f5afe03c13d8d726c4b2aca4ce5e0901e md5: c6970314e455e0c04eee0be160adbebb @@ -933,6 +1322,14 @@ packages: license: LicenseRef-Modular-Proprietary size: 83375027 timestamp: 1777596028766 +- conda: https://conda.modular.com/max/linux-64/mojo-compiler-1.0.0b1-release.conda + sha256: 706c7f8e2be740dda8039bf96182b578bfbbd9220ca1a7f762e1f82acc4eb784 + md5: 2fc6038c3837e50bb855bcf7f930c1c9 + depends: + - mojo-python ==1.0.0b1 + license: LicenseRef-Modular-Proprietary + size: 89421276 + timestamp: 1777595833113 - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-1.0.0b1-release.conda sha256: 6d6973cc34960597e786ad0f0ed0eba2c005d08eeefd37df53d2cd489ee2acd6 md5: 6b81a95a59f729be52dc9685210165e5 @@ -977,6 +1374,15 @@ packages: 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/linux-aarch64/ncurses-6.6-hf8d1292_0.conda sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca md5: b2a43456aa56fe80c2477a5094899eff @@ -993,6 +1399,22 @@ packages: license: X11 AND BSD-3-Clause size: 805509 timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.5-py310hd8a072f_1.conda + noarch: python + sha256: 3bb2aa2bf8758f4f1269fa36d67020e4f25199366773e2b73164456ce9286dc3 + md5: 8719dd226e9a128bd10033746e2418c6 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 678701 + timestamp: 1777219093168 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nh3-0.3.5-py310h8c58d24_1.conda noarch: python sha256: 6ee2009d1ab2ded386b773902109892343993d1c0c4778baa76d3936f1d01d45 @@ -1023,6 +1445,17 @@ packages: license_family: MIT size: 631222 timestamp: 1777219210592 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb + md5: da1b85b6a87e141f5140bb9924cecab0 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3167099 + timestamp: 1775587756857 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 md5: 3b129669089e4d6a5c6871dbb4669b99 @@ -1062,6 +1495,18 @@ packages: 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 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1222481 + timestamp: 1763655398280 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 md5: 1a30c42e32ca0ea216bd0bfe6f842f0b @@ -1122,6 +1567,33 @@ packages: license_family: BSD size: 21085 timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda + build_number: 100 + sha256: dec247c5badc811baa34d6085df9d0465535883cf745e22e8d79092ad54a3a7b + md5: a443f87920815d41bfe611296e507995 + 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 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libuuid >=2.42,<3.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: 36705460 + timestamp: 1775614357822 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda build_number: 100 sha256: d29da77f75e8f9184cc9502d5c44be87397291a9e88819d5418322a173f76303 @@ -1219,6 +1691,22 @@ packages: license_family: BSD size: 6989 timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + noarch: python + sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 + md5: 082985717303dab433c976986c674b35 + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - 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 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda noarch: python sha256: afdff66cb54e22d0d2c682731e08bb8f319dfd93f3cdcff4a4640cb5a8ae2460 @@ -1249,6 +1737,17 @@ packages: license_family: BSD size: 191641 timestamp: 1771717073430 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 345073 + timestamp: 1765813471974 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 md5: 3d49cad61f829f4f0e0611547a9cda12 @@ -1330,6 +1829,20 @@ packages: license_family: MIT size: 208577 timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.12-h994f30f_0.conda + noarch: python + sha256: 98c771464ed93a2733bae460c39cfa9640feb20972d2e651b44e85db296942eb + md5: 3c8f229055ad244fa3a97c6c45b77099 + 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-aarch64/ruff-0.15.12-h2842840_0.conda noarch: python sha256: 2a02980403d4f151216de7d6220a2ce8487dafd3b5ebe478728c04fac1af4f6e @@ -1356,6 +1869,19 @@ packages: license_family: MIT size: 8485007 timestamp: 1778119519471 +- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda + sha256: f6883925a130126cdbdc62c2f43513db53c9f889cde4abc3bc66542336a87150 + md5: 54452085855583ccc3cc5dcd17b47ffe + 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-aarch64/secretstorage-3.4.1-py314ha42fa4b_0.conda sha256: 6e536dc5157dd21a1cdfab4c0ee737aca3a942865694cb87d01b78515cae036d md5: 52f075b52b3bae9ecd903e984c7417bc @@ -1379,6 +1905,19 @@ packages: license_family: MIT size: 18455 timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: cffd3bdd58090148f4cfcd831f4b26ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + 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-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 md5: 7fc6affb9b01e567d2ef1d05b84aa6ed @@ -1411,6 +1950,18 @@ packages: license_family: MIT size: 21561 timestamp: 1774492402955 +- 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 + license: Apache-2.0 + license_family: Apache + size: 912476 + timestamp: 1774358032579 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py314hafb4487_0.conda sha256: a7096330909a4b3345cbaecea099613929aae52900310209e0e27e616b550e4c md5: 6fa496cc0b64d496a6a755c9de72f17b @@ -1493,6 +2044,19 @@ packages: license_family: MIT size: 103560 timestamp: 1778188657149 +- 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-aarch64/zeromq-4.3.5-hc0523f8_10.conda sha256: 32f77d565687a8241ebfb66fe630dcb197efc84f6a8b59df8260b1191b7deb2c md5: ac79d51c73c8fbe6ef6e9067191b7f1a @@ -1527,6 +2091,16 @@ packages: license_family: MIT size: 24461 timestamp: 1776131454755 +- 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/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 md5: c3655f82dcea2aa179b291e7099c1fcc diff --git a/pixi.toml b/pixi.toml index e3ffad1a..ee77b178 100644 --- a/pixi.toml +++ b/pixi.toml @@ -4,12 +4,12 @@ channels = ["https://conda.modular.com/max", "https://repo.prefix.dev/modular-co description = "An arbitrary-precision decimal and integer library for Mojo" license = "Apache-2.0" name = "decimo" -platforms = ["osx-arm64", "linux-64"] +platforms = ["osx-arm64", "linux-64", "linux-aarch64"] readme = "README.md" version = "0.10.0" [dependencies] -# argmojo = "==0.6.0" # CLI argument parsing for the Decimo calculator +# argmojo = ">=0.6.0,<0.7" # CLI argument parsing for the Decimo calculator mojo = ">=1.0.0b1,<2" # Mojo language compiler and runtime python = ">=3.13" # For Python bindings and tests python-build = ">=0.2.0" # Build PyPI wheel (`pixi run wheel`) From 4ede42dda0fa851033693ac9f41265886db6574f Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 01:47:09 +0800 Subject: [PATCH 08/10] Update --- .github/workflows/run_tests.yaml | 7 +++++++ pixi.toml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yaml b/.github/workflows/run_tests.yaml index f386766b..93db1fe9 100644 --- a/.github/workflows/run_tests.yaml +++ b/.github/workflows/run_tests.yaml @@ -316,6 +316,13 @@ jobs: echo "=== build crashed, retrying in 5s... ===" sleep 5 done + - name: Stage decimo.mojopkg next to tests + # `tests/test.sh run_cli` and `run_bigfloat` use `-I tests` to load + # the prebuilt `decimo.mojopkg` (Mojo 1.0.0b1's `mojo run/build` + # cannot resolve `decimo.X.Y.foo` qualified references when + # re-traversing source via `-I src`). `pixi run buildcli` produces + # the package at `temp/decimo.mojopkg`, so stage a copy here. + run: cp temp/decimo.mojopkg tests/ - name: Run tests (with retry for Mojo compiler intermittent crashes) run: | for attempt in 1 2 3; do diff --git a/pixi.toml b/pixi.toml index ee77b178..1fe77259 100644 --- a/pixi.toml +++ b/pixi.toml @@ -97,7 +97,7 @@ buildcli = """pixi run fetch \ && pixi run mojo build -I temp -I src/cli -o decimo src/cli/main.mojo""" # buildcli = """pixi run mojo build -I src -I src/cli -o decimo src/cli/main.mojo""" tcli = "clear && pixi run test cli" -testcli = "pixi run buildcli && bash tests/test.sh cli" +testcli = "pixi run buildcli && cp temp/decimo.mojopkg tests/ && bash tests/test.sh cli" # python bindings (mojo4py) bpy = "clear && pixi run buildpy" From b93798a61224bcf21862d12cb7b0745a69eeedad Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 16:49:15 +0800 Subject: [PATCH 09/10] Use argmojo via pixi --- .github/actions/setup-decimo/action.yml | 1 - pixi.lock | 556 +----------------------- pixi.toml | 29 +- 3 files changed, 35 insertions(+), 551 deletions(-) diff --git a/.github/actions/setup-decimo/action.yml b/.github/actions/setup-decimo/action.yml index 8da170f1..cab5207e 100644 --- a/.github/actions/setup-decimo/action.yml +++ b/.github/actions/setup-decimo/action.yml @@ -6,7 +6,6 @@ runs: steps: - uses: prefix-dev/setup-pixi@v0.9.5 with: - cache: true activate-environment: true - name: Download decimo.mojopkg artifact uses: actions/download-artifact@v4 diff --git a/pixi.lock b/pixi.lock index fe7c824d..d40b3287 100644 --- a/pixi.lock +++ b/pixi.lock @@ -11,6 +11,7 @@ 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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://repo.prefix.dev/modular-community/linux-64/argmojo-0.6.0-hb0f4dca_0.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 @@ -103,103 +104,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.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/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/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.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/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.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/linux-aarch64/cmarkgfm-2024.11.20-py314h51f160d_1.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/linux-aarch64/cryptography-48.0.0-py314hbfac26c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-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.1.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/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/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/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-aarch64/keyutils-1.6.3-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_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/noarch/mblack-26.3.0-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-1.0.0b1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-1.0.0b1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-1.0.0b1-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.2-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-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nh3-0.3.5-py310h8c58d24_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_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-aarch64/pcre2-10.47-hf841c20_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/pycparser-2.22-pyh29332c3_1.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-aarch64/python-3.14.4-hfd9ac0a_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-gil-3.14.4-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-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.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/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-aarch64/ruff-0.15.12-h2842840_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.4.1-py314ha42fa4b_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-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py314hafb4487_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-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/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://repo.prefix.dev/modular-community/osx-arm64/argmojo-0.6.0-h60d57d3_0.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 @@ -294,18 +201,6 @@ packages: license_family: BSD size: 28948 timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - build_number: 20 - sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 - md5: 468fd3bb9e1f671d36c2cbc677e56f1d - depends: - - libgomp >=7.5.0 - constrains: - - openmp_impl <0.0a0 - license: BSD-3-Clause - license_family: BSD - size: 28926 - timestamp: 1770939656741 - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 md5: aaa2a381ccc56eac91d63b6c1240312f @@ -316,6 +211,22 @@ packages: license_family: MIT size: 8191 timestamp: 1744137672556 +- conda: https://repo.prefix.dev/modular-community/linux-64/argmojo-0.6.0-hb0f4dca_0.conda + sha256: 55c8077091632b4a012e53a7dbbec4dceac4171503d92cc6372f62e8611900ed + md5: 49da259bda4189b4807c8827357e23fe + depends: + - mojo-compiler 1.0.0b1.* + license: Apache-2.0 + size: 2113584 + timestamp: 1778610927336 +- conda: https://repo.prefix.dev/modular-community/osx-arm64/argmojo-0.6.0-h60d57d3_0.conda + sha256: 4504bc8420f20611cdcebab8280b24681af3921bcc29ad2e197301cc44b28ff2 + md5: 88c4863e9de3507dba925c4f48a3bd53 + depends: + - mojo-compiler 1.0.0b1.* + license: Apache-2.0 + size: 2112885 + timestamp: 1778604915940 - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 md5: 767d508c1a67e02ae8f50e44cacfadb2 @@ -360,21 +271,6 @@ packages: license_family: MIT size: 367376 timestamp: 1764017265553 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 - md5: a1b5c571a0923a205d663d8678df4792 - depends: - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - constrains: - - libbrotlicommon 1.2.0 he30d5cf_1 - license: MIT - license_family: MIT - size: 373193 - timestamp: 1764017486851 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 md5: f9501812fe7c66b6548c7fcaa1c1f252 @@ -400,15 +296,6 @@ packages: license_family: BSD size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c - md5: 840d8fc0d7b3209be93080bc20e07f2d - depends: - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD - size: 192412 - timestamp: 1771350241232 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df md5: 620b85a3f45526a8bc4d23fd78fc22f0 @@ -448,19 +335,6 @@ packages: license_family: MIT size: 300271 timestamp: 1761203085220 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - sha256: 728e55b32bf538e792010308fbe55d26d02903ddc295fbe101167903a123dd6f - md5: f333c475896dbc8b15efd8f7c61154c7 - depends: - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - pycparser - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 318357 - timestamp: 1761203973223 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98 md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7 @@ -508,19 +382,6 @@ packages: license_family: MIT size: 144534 timestamp: 1760363043706 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmarkgfm-2024.11.20-py314h51f160d_1.conda - sha256: ebaeb5b8593f0d27a9f65a76ea28b03afb0dd095f067f5bd3c5008f277e23681 - md5: bfcfa0592390fbc8311b4f9181138f23 - depends: - - cffi >=1.0.0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 135485 - timestamp: 1760363090161 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py314hb84d1df_1.conda sha256: 17fd950dd391f5471210a3a0fcddd2a0b4d5affa6da67f9d9e01dd276192c856 md5: 53a4b07a7da29004b99261d77798109c @@ -569,21 +430,6 @@ packages: license_family: BSD size: 1926884 timestamp: 1777966253398 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-48.0.0-py314hbfac26c_0.conda - sha256: 7ae2112207338f759632ae4fdb1febf93149f9d074cd3f701de5a2967719cf66 - md5: 4c15184e771e73b89928eb3d9a7e8106 - depends: - - cffi >=2.0 - - libgcc >=14 - - openssl >=3.5.6,<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: 1969324 - timestamp: 1777966101392 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 md5: ce96f2f470d39bd96ce03945af92e280 @@ -597,18 +443,6 @@ packages: license: AFL-2.1 OR GPL-2.0-or-later size: 447649 timestamp: 1764536047944 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - sha256: 3af801577431af47c0b72a82bb93c654f03072dece0a2a6f92df8a6802f52a22 - md5: a4b6b82427d15f0489cef0df2d82f926 - depends: - - libstdcxx >=14 - - libgcc >=14 - - libglib >=2.86.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - license: AFL-2.1 OR GPL-2.0-or-later - size: 480416 - timestamp: 1764536098891 - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e md5: d6bd3cd217e62bbd7efe67ff224cd667 @@ -805,14 +639,6 @@ packages: license: LGPL-2.1-or-later size: 134088 timestamp: 1754905959823 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 - md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 - depends: - - libgcc >=13 - license: LGPL-2.1-or-later - size: 129048 - timestamp: 1754906002667 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 md5: fb53fb07ce46a575c5d004bbc96032c2 @@ -828,20 +654,6 @@ packages: license_family: MIT size: 1386730 timestamp: 1769769569681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba - md5: d9ca108bd680ea86a963104b6b3e95ca - depends: - - 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 - license: MIT - license_family: MIT - size: 1517436 - timestamp: 1769773395215 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed md5: e446e1822f4da8e5080a9de93474184d @@ -867,17 +679,6 @@ packages: license_family: GPL size: 728002 timestamp: 1774197446916 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda - sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 - md5: a21644fc4a83da26452a718dc9468d5f - depends: - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-aarch64 2.45.1 - license: GPL-3.0-only - license_family: GPL - size: 875596 - timestamp: 1774197520746 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda sha256: dddd01bd6b338221342a89530a1caffe6051a70cc8f8b1d8bb591d5447a3c603 md5: ff484b683fecf1e875dfc7aa01d19796 @@ -899,17 +700,6 @@ packages: license_family: BSD size: 134676 timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 - md5: fb640d776fc92b682a14e001980825b1 - depends: - - ncurses - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD - size: 148125 - timestamp: 1738479808948 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 md5: 44083d2d2c2025afca315c7a172eab2b @@ -933,17 +723,6 @@ packages: license_family: MIT size: 77241 timestamp: 1777846112704 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda - sha256: 206c422a7f4b462d1dc17d558f0299088d0992bd3309ae83f5440fcc4f130602 - md5: 3bacd6171f0a3f8fddd06c3d5ae01955 - depends: - - libgcc >=14 - constrains: - - expat 2.8.0.* - license: MIT - license_family: MIT - size: 76996 - timestamp: 1777846096032 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c md5: 65466e82c09e888ca7560c11a97d5450 @@ -965,15 +744,6 @@ packages: license_family: MIT size: 58592 timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 - md5: 2f364feefb6a7c00423e80dcb12db62a - depends: - - libgcc >=14 - license: MIT - license_family: MIT - size: 55952 - timestamp: 1769456078358 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 md5: 43c04d9cb46ef176bb2a4c77e324d599 @@ -996,18 +766,6 @@ packages: license_family: GPL size: 1041084 timestamp: 1778269013026 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 - md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a - depends: - - _openmp_mutex >=4.5 - constrains: - - libgomp 15.2.0 h8acb6b2_19 - - libgcc-ng ==15.2.0=*_19 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 622462 - timestamp: 1778268755949 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda sha256: 33eb5d5310a5c2c0a4707a0afa644801c2e08c8f70c45e1f62f354116dfe0970 md5: 17d484ab9c8179c6a6e5b7dbb5065afc @@ -1023,20 +781,6 @@ packages: license: LGPL-2.1-or-later size: 4754097 timestamp: 1778508800134 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda - sha256: 050285afdb7bd98b1b8fb052af9da31fafde586a49d3b56dd33d5338b2d0e411 - md5: 16d72f76bf6fead4a29efb2fede0a06b - depends: - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.2,<2.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: 4946648 - timestamp: 1778508920982 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b md5: faac990cb7aedc7f3a2224f2c9b0c26c @@ -1046,13 +790,6 @@ packages: license_family: GPL size: 603817 timestamp: 1778268942614 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 - md5: c5e8a379c4a2ec2aea4ba22758c001d9 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 587387 - timestamp: 1778268674393 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -1062,14 +799,6 @@ packages: license: LGPL-2.1-only size: 790176 timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 - md5: 5a86bf847b9b926f3a4f203339748d78 - depends: - - libgcc >=14 - license: LGPL-2.1-only - size: 791226 - timestamp: 1754910975665 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d md5: b88d90cad08e6bc8ad540cb310a761fb @@ -1081,16 +810,6 @@ packages: license: 0BSD size: 113478 timestamp: 1775825492909 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c - md5: 76298a9e6d71ee6e832a8d0d7373b261 - depends: - - libgcc >=14 - constrains: - - xz 5.8.3.* - license: 0BSD - size: 126102 - timestamp: 1775828008518 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e md5: b1fd823b5ae54fbec272cea0811bd8a9 @@ -1111,15 +830,6 @@ packages: license_family: BSD size: 92400 timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 - md5: 7b9813e885482e3ccb1fa212b86d7fd0 - depends: - - libgcc >=14 - license: BSD-2-Clause - license_family: BSD - size: 114056 - timestamp: 1769482343003 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 md5: 57c4be259f5e0b99a5983799a228ae55 @@ -1138,14 +848,6 @@ packages: license: ISC size: 277661 timestamp: 1772479381288 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda - sha256: d6112f3a7e7ffcd726ce653724f979b528cb8a19675fc06016a5d360ef94e9a4 - md5: 9e1fe4202543fa5b6ab58dbf12d34ced - depends: - - libgcc >=14 - license: ISC - size: 272649 - timestamp: 1772479384085 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 md5: 7cc5247987e6d115134ebab15186bc13 @@ -1164,15 +866,6 @@ packages: license: blessing size: 954962 timestamp: 1777986471789 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda - sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 - md5: 2ec1119217d8f0d086e9a62f3cb0e5ea - depends: - - libgcc >=14 - - libzlib >=1.3.2,<2.0a0 - license: blessing - size: 955361 - timestamp: 1777986487553 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 md5: 6681822ea9d362953206352371b6a904 @@ -1194,17 +887,6 @@ packages: license_family: GPL size: 5852044 timestamp: 1778269036376 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e - md5: 543fbc8d71f2a0baf04cf88ce96cb8bb - depends: - - libgcc 15.2.0 h8acb6b2_19 - constrains: - - libstdcxx-ng ==15.2.0=*_19 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 5546559 - timestamp: 1778268777463 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 md5: 38ffe67b78c9d4de527be8315e5ada2c @@ -1215,15 +897,6 @@ packages: license_family: BSD size: 40297 timestamp: 1775052476770 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda - sha256: 7d427edf58c702c337bf62bc90f355b7fc374a65fd9f70ea7a490f13bb76b1b9 - md5: a0b5de740d01c390bdbb46d7503c9fab - depends: - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - size: 43567 - timestamp: 1775052485727 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 md5: d87ff7921124eccd67248aa483c23fec @@ -1235,15 +908,6 @@ packages: license_family: Other size: 63629 timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f - md5: 502006882cf5461adced436e410046d1 - constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 69833 - timestamp: 1774072605429 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 md5: bc5a5721b6439f2f62a84f2548136082 @@ -1300,17 +964,6 @@ packages: license: LicenseRef-Modular-Proprietary size: 94106548 timestamp: 1777595784229 -- conda: https://conda.modular.com/max/linux-aarch64/mojo-1.0.0b1-release.conda - sha256: bcc1b91f2d39ab25e430d2de0c552b6f5afe03c13d8d726c4b2aca4ce5e0901e - md5: c6970314e455e0c04eee0be160adbebb - depends: - - python >=3.10 - - mojo-compiler ==1.0.0b1 - - mblack ==26.3.0 - - jupyter_client >=8.6.2,<8.7 - license: LicenseRef-Modular-Proprietary - size: 92647635 - timestamp: 1777595798392 - conda: https://conda.modular.com/max/osx-arm64/mojo-1.0.0b1-release.conda sha256: 2980b825e3eedb153f68f74edeaae6a7b819912c3eb6e49f1eed7d25f883e050 md5: b5f2c6b04a9e2bbe199fef1ea5677014 @@ -1330,14 +983,6 @@ packages: license: LicenseRef-Modular-Proprietary size: 89421276 timestamp: 1777595833113 -- conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-1.0.0b1-release.conda - sha256: 6d6973cc34960597e786ad0f0ed0eba2c005d08eeefd37df53d2cd489ee2acd6 - md5: 6b81a95a59f729be52dc9685210165e5 - depends: - - mojo-python ==1.0.0b1 - license: LicenseRef-Modular-Proprietary - size: 86382462 - timestamp: 1777595795606 - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-1.0.0b1-release.conda sha256: 3e0d6e6e814cb39d14d24234eb8f2ac6524379ea0a9c398a54e77598844e96d6 md5: fe08c02512b02563a0b878eeb32a684b @@ -1383,14 +1028,6 @@ packages: license: X11 AND BSD-3-Clause size: 918956 timestamp: 1777422145199 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca - md5: b2a43456aa56fe80c2477a5094899eff - depends: - - libgcc >=14 - license: X11 AND BSD-3-Clause - size: 960036 - timestamp: 1777422174534 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d md5: 343d10ed5b44030a2f67193905aea159 @@ -1415,21 +1052,6 @@ packages: license_family: MIT size: 678701 timestamp: 1777219093168 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nh3-0.3.5-py310h8c58d24_1.conda - noarch: python - sha256: 6ee2009d1ab2ded386b773902109892343993d1c0c4778baa76d3936f1d01d45 - md5: 62f101243b4d2a7abedbf4f5c9dd9681 - depends: - - python - - libgcc >=14 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - size: 674731 - timestamp: 1777219098394 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.5-py310h3b8a9b8_1.conda noarch: python sha256: 5932e04c48ab4e08452ea0e681969706d8b1d8574f3147a39577bec02eac38a7 @@ -1456,16 +1078,6 @@ packages: license_family: Apache size: 3167099 timestamp: 1775587756857 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda - sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 - md5: 3b129669089e4d6a5c6871dbb4669b99 - depends: - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - size: 3706406 - timestamp: 1775589602258 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea md5: 25dcccd4f80f1638428613e0d7c9b4e1 @@ -1507,17 +1119,6 @@ packages: license_family: BSD size: 1222481 timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 - md5: 1a30c42e32ca0ea216bd0bfe6f842f0b - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 1166552 - timestamp: 1763655534263 - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 @@ -1594,32 +1195,6 @@ packages: size: 36705460 timestamp: 1775614357822 python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda - build_number: 100 - sha256: d29da77f75e8f9184cc9502d5c44be87397291a9e88819d5418322a173f76303 - md5: 3cfbe780f0f51cc8cba41db9f8a28bfe - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.7.5,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.52.0,<4.0a0 - - libuuid >=2.42,<3.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: 37409899 - timestamp: 1775613674766 - python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda build_number: 100 sha256: 27e7d6cbe021f37244b643f06a98e46767255f7c2907108dd3736f042757ddad @@ -1707,21 +1282,6 @@ packages: license_family: BSD size: 211567 timestamp: 1771716961404 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - noarch: python - sha256: afdff66cb54e22d0d2c682731e08bb8f319dfd93f3cdcff4a4640cb5a8ae2460 - md5: 130d781798bb24a0b86290e65acd50d8 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - zeromq >=4.3.5,<4.4.0a0 - - _python_abi3_support 1.* - - cpython >=3.12 - license: BSD-3-Clause - license_family: BSD - size: 212585 - timestamp: 1771716963309 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda noarch: python sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772 @@ -1748,16 +1308,6 @@ packages: license_family: GPL size: 345073 timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 - md5: 3d49cad61f829f4f0e0611547a9cda12 - depends: - - libgcc >=14 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 357597 - timestamp: 1765815673644 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 md5: f8381319127120ce51e081dce4865cf4 @@ -1843,19 +1393,6 @@ packages: license_family: MIT size: 9266480 timestamp: 1778119386343 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.15.12-h2842840_0.conda - noarch: python - sha256: 2a02980403d4f151216de7d6220a2ce8487dafd3b5ebe478728c04fac1af4f6e - md5: 39880da48590e92bb1ef6661c132d124 - depends: - - python - - libgcc >=14 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - size: 8898060 - timestamp: 1778119389286 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.12-hbd3f8a3_0.conda noarch: python sha256: 91992a557456cbe9980e8ffb0f0d1200f65f741adeefc7ecf568d1935690a7bc @@ -1882,19 +1419,6 @@ packages: license_family: BSD size: 34098 timestamp: 1763045408414 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.4.1-py314ha42fa4b_0.conda - sha256: 6e536dc5157dd21a1cdfab4c0ee737aca3a942865694cb87d01b78515cae036d - md5: 52f075b52b3bae9ecd903e984c7417bc - 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: 34275 - timestamp: 1763046783366 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -1918,18 +1442,6 @@ packages: license_family: BSD size: 3301196 timestamp: 1769460227866 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 - md5: 7fc6affb9b01e567d2ef1d05b84aa6ed - depends: - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - size: 3368666 - timestamp: 1769464148928 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 md5: a9d86bc62f39b94c4661716624eb21b0 @@ -1962,17 +1474,6 @@ packages: license_family: Apache size: 912476 timestamp: 1774358032579 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py314hafb4487_0.conda - sha256: a7096330909a4b3345cbaecea099613929aae52900310209e0e27e616b550e4c - md5: 6fa496cc0b64d496a6a755c9de72f17b - depends: - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 914247 - timestamp: 1774359407535 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py314h6c2aa35_0.conda sha256: 4ccc4a20d676c0ba85adee9c99015bec7f5b685df0cf8006e34573f1d6c2ce75 md5: 3f81f8b2fe2c26a82c0abf57ab2b9610 @@ -2057,18 +1558,6 @@ packages: license_family: MOZILLA size: 311150 timestamp: 1772476812121 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - sha256: 32f77d565687a8241ebfb66fe630dcb197efc84f6a8b59df8260b1191b7deb2c - md5: ac79d51c73c8fbe6ef6e9067191b7f1a - depends: - - libgcc >=14 - - libstdcxx >=14 - - libsodium >=1.0.21,<1.0.22.0a0 - - krb5 >=1.22.2,<1.23.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 350773 - timestamp: 1772476818466 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868 md5: e85dcd3bde2b10081cdcaeae15797506 @@ -2101,15 +1590,6 @@ packages: license_family: BSD size: 601375 timestamp: 1764777111296 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 - md5: c3655f82dcea2aa179b291e7099c1fcc - depends: - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 614429 - timestamp: 1764777145593 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 md5: ab136e4c34e97f34fb621d2592a393d8 diff --git a/pixi.toml b/pixi.toml index 1fe77259..5f1b627c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -4,12 +4,12 @@ channels = ["https://conda.modular.com/max", "https://repo.prefix.dev/modular-co description = "An arbitrary-precision decimal and integer library for Mojo" license = "Apache-2.0" name = "decimo" -platforms = ["osx-arm64", "linux-64", "linux-aarch64"] +platforms = ["osx-arm64", "linux-64"] readme = "README.md" version = "0.10.0" [dependencies] -# argmojo = ">=0.6.0,<0.7" # CLI argument parsing for the Decimo calculator +argmojo = ">=0.6.0,<0.7" # CLI argument parsing for the Decimo calculator mojo = ">=1.0.0b1,<2" # Mojo language compiler and runtime python = ">=3.13" # For Python bindings and tests python-build = ">=0.2.0" # Build PyPI wheel (`pixi run wheel`) @@ -81,21 +81,26 @@ dec_debug = """clear && pixi run package && cd benches/decimal128 \ # Fetch argmojo source code for CLI calculator # Only do this when necessary -# (argmojo is not compatible with the latest mojo version) -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""" +# (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""" # cli calculator bcli = "clear && pixi run buildcli" -# Uncomment the following lines if we build the CLI package with -# local clone of argmojo -buildcli = """pixi run fetch \ -&& mkdir -p temp \ +# 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 mojo package src/decimo -o temp/decimo.mojopkg \ -&& pixi run mojo package temp/argmojo/src/argmojo -o temp/argmojo.mojopkg \ && pixi run mojo build -I temp -I src/cli -o decimo src/cli/main.mojo""" -# buildcli = """pixi run mojo build -I src -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 package src/decimo -o temp/decimo.mojopkg \ +# && pixi run mojo package temp/argmojo/src/argmojo -o temp/argmojo.mojopkg \ +# && 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.mojopkg tests/ && bash tests/test.sh cli" From c6e95205a30b3a53dd350e8ea5eaac4536a4ed7c Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Wed, 13 May 2026 17:26:31 +0800 Subject: [PATCH 10/10] Address comments --- src/decimo/bigdecimal/arithmetics.mojo | 3 +- src/decimo/biguint/arithmetics.mojo | 49 ++++++++------------------ src/decimo/decimal128/utility.mojo | 35 ++++++++++-------- tests/test.sh | 18 ++++++++++ tests/test_cli.sh | 10 ++++++ 5 files changed, 64 insertions(+), 51 deletions(-) diff --git a/src/decimo/bigdecimal/arithmetics.mojo b/src/decimo/bigdecimal/arithmetics.mojo index 2d483bb7..c3290028 100644 --- a/src/decimo/bigdecimal/arithmetics.mojo +++ b/src/decimo/bigdecimal/arithmetics.mojo @@ -21,7 +21,6 @@ Implements functions for mathematical operations on BigDecimal objects. from std import math import decimo.biguint.arithmetics -import decimo.bigdecimal.arithmetics from decimo.bigdecimal.rounding import round_to_precision from decimo.errors import ZeroDivisionError from decimo.rounding_mode import RoundingMode @@ -764,7 +763,7 @@ def _true_divide_general_truncated( sign=result.sign, ) # Verify: stripped * y == x (using original, untruncated operands) - var product = decimo.bigdecimal.arithmetics.multiply(stripped, y) + var product = multiply(stripped, y) if product == x: return stripped^ diff --git a/src/decimo/biguint/arithmetics.mojo b/src/decimo/biguint/arithmetics.mojo index b68fe72e..ab86f42a 100644 --- a/src/decimo/biguint/arithmetics.mojo +++ b/src/decimo/biguint/arithmetics.mojo @@ -23,7 +23,6 @@ from std import math from std.memory import memcpy, memset_zero from decimo.biguint.biguint import BigUInt -import decimo.biguint.arithmetics import decimo.biguint.comparison from decimo.errors import ( OverflowError, @@ -2769,10 +2768,8 @@ def floor_divide_burnikel_ziegler( var ndigits_to_shift: Int if normalized_b.words[len(normalized_b.words) - 1] < 500_000_000: - ndigits_to_shift = ( - decimo.biguint.arithmetics.calculate_ndigits_for_normalization( - normalized_b.words[len(normalized_b.words) - 1] - ) + ndigits_to_shift = calculate_ndigits_for_normalization( + normalized_b.words[len(normalized_b.words) - 1] ) else: ndigits_to_shift = 0 @@ -2792,12 +2789,8 @@ def floor_divide_burnikel_ziegler( n - len(normalized_b.words) ) * 9 + ndigits_to_shift - decimo.biguint.arithmetics.multiply_by_power_of_ten_inplace( - normalized_b, n_digits_to_scale_up - ) - decimo.biguint.arithmetics.multiply_by_power_of_ten_inplace( - normalized_a, n_digits_to_scale_up - ) + multiply_by_power_of_ten_inplace(normalized_b, n_digits_to_scale_up) + multiply_by_power_of_ten_inplace(normalized_a, n_digits_to_scale_up) # The normalized_b is now 9 digits, but may still be smaller than 500_000_000. var gap_ratio: UInt32 @@ -2815,12 +2808,8 @@ def floor_divide_burnikel_ziegler( ) if gap_ratio >= 2: - decimo.biguint.arithmetics.multiply_by_uint32_inplace( - normalized_b, gap_ratio - ) - decimo.biguint.arithmetics.multiply_by_uint32_inplace( - normalized_a, gap_ratio - ) + multiply_by_uint32_inplace(normalized_b, gap_ratio) + multiply_by_uint32_inplace(normalized_a, gap_ratio) # STEP 2: Split the normalized a into blocks of size n. # t is the number of blocks in the dividend. @@ -2874,17 +2863,13 @@ def floor_divide_burnikel_ziegler( ) q_i = _tuple[0].copy() z = _tuple[1].copy() - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace( - q, n - ) + multiply_by_power_of_billion_inplace(q, n) q += q_i if i > 0: - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace( - z, n - ) + multiply_by_power_of_billion_inplace(z, n) # z = r + a[(i - 1) * n : i * n] - decimo.biguint.arithmetics.add_by_slice_inplace( + add_by_slice_inplace( z, normalized_a, bounds_y=((i - 1) * n, i * n), @@ -2949,9 +2934,7 @@ def floor_divide_two_by_one( var s = _tuple[1].copy() # s is the final remainder # q -> q1q0 - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace( - q, n // 2 - ) + multiply_by_power_of_billion_inplace(q, n // 2) q += q0 return (q^, s^) @@ -2994,19 +2977,19 @@ def floor_divide_three_by_two( a2a1 = a1.copy() else: a2a1 = a2.copy() - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace(a2a1, n) + 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 q = _tuple[0].copy() ref c = _tuple[1] # c is the carry var d = q * b0 - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace(c, n) + multiply_by_power_of_billion_inplace(c, n) var r = c + a0 if r < d: var b = b1.copy() - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace(b, n) + multiply_by_power_of_billion_inplace(b, n) b += b0 q -= BigUInt.one() r += b @@ -3116,9 +3099,7 @@ def floor_divide_slices_two_by_one( var s = _tuple[1].copy() # s is the final remainder # q -> q1q0 - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace( - q, n // 2 - ) + multiply_by_power_of_billion_inplace(q, n // 2) q += q0 return (q^, s^) @@ -3186,7 +3167,7 @@ def floor_divide_slices_three_by_two( ref c = _tuple[1] # c is the carry var d = multiply_slices(q, b, (0, len(q.words)), bounds_b0) - decimo.biguint.arithmetics.multiply_by_power_of_billion_inplace(c, n) + multiply_by_power_of_billion_inplace(c, n) var r = add_slices(c, a, bounds_x=(0, len(c.words)), bounds_y=bounds_a0) if r < d: diff --git a/src/decimo/decimal128/utility.mojo b/src/decimo/decimal128/utility.mojo index c07584e0..41a010ae 100644 --- a/src/decimo/decimal128/utility.mojo +++ b/src/decimo/decimal128/utility.mojo @@ -1305,7 +1305,7 @@ def power_of_10_unsafe[ dtype == DType.uint128 or dtype == DType.uint256 ): """ - Returns 10^n via a single indexed load from a string-literal rodata blob. + Returns 10^n via a single indexed load from a comptime InlineArray table. Parameters: dtype: The Mojo scalar type to calculate the power of 10 for. Must be @@ -1323,25 +1323,30 @@ 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 read past - the end of the rodata blob and return arbitrary bits. Callers must + 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: each entry is a 16-byte (uint128) or 32-byte - (uint256) little-endian raw value packed contiguously in a - `StringLiteral` blob. `unsafe_ptr().bitcast[Scalar[dtype]]()[n]` - yields the n-th value with a single indexed load. The - `StringLiteral` lives in rodata for the lifetime of the program; - no stack materialisation, no allocation, no per-call-site - `InlineArray` rebuild. - - TODO: Drop this function once Mojo grows module-level variables - and the elegant `var POWER_OF_10_U128 = InlineArray[UInt128, 29]` - approach becomes possible. See the comment block above for the - full migration plan. + 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]`. + + 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. """ comptime if dtype == DType.uint128: diff --git a/tests/test.sh b/tests/test.sh index bfb3d759..fa056f27 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -29,10 +29,26 @@ set -eo pipefail REPO_ROOT=$(cd "$(dirname "$0")/.." && pwd) cd "$REPO_ROOT" +# ── Preflight: ensure tests/decimo.mojopkg exists ─────────────────────────── +# All Mojo test invocations below use `-I tests` to pick up the prebuilt +# `decimo.mojopkg` (Mojo 1.0.0b1's `mojo run` cannot resolve +# `decimo.X.Y.foo` qualified references when re-traversing source via +# `-I src`). On a fresh checkout the package may not exist yet, so build +# it on demand. CI normally stages a prebuilt artifact via the +# `setup-decimo` action, in which case this is a no-op. +ensure_decimo_mojopkg() { + if [[ -f tests/decimo.mojopkg ]]; then + return 0 + fi + echo "tests/decimo.mojopkg not found; building it now..." + pixi run mojo package src/decimo -o tests/decimo.mojopkg +} + # ── Suite definitions ──────────────────────────────────────────────────────── run_mojo_suite() { local dir="$1" + ensure_decimo_mojopkg for f in tests/"$dir"/*.mojo; do echo "=== $f ===" # Retry once on transient Python init crash (libpython sporadic load failure). @@ -64,6 +80,7 @@ run_toml() { run_mojo_suite toml; } run_bigfloat() { # BigFloat tests require the C wrapper (libdecimo_gmp_wrapper) and MPFR. + ensure_decimo_mojopkg local WRAPPER_DIR="src/decimo/gmp" local WRAPPER_LIB if [[ "$(uname)" == "Darwin" ]]; then @@ -94,6 +111,7 @@ run_bigfloat() { run_cli() { # CLI tests need the extra -I src/cli include path + ensure_decimo_mojopkg for f in tests/cli/*.mojo; do pixi run mojo run -I tests -I src/cli -D ASSERT=all --debug-level=full "$f" done diff --git a/tests/test_cli.sh b/tests/test_cli.sh index dd3b0626..760ff180 100644 --- a/tests/test_cli.sh +++ b/tests/test_cli.sh @@ -6,6 +6,16 @@ set -e # Exit immediately if any command fails REPO_ROOT=$(cd "$(dirname "$0")/.." && pwd) cd "$REPO_ROOT" +# ── Preflight: ensure tests/decimo.mojopkg exists ─────────────────────────── +# CLI unit tests use `-I tests` to pick up the prebuilt `decimo.mojopkg` +# (Mojo 1.0.0b1's `mojo run` cannot resolve `decimo.X.Y.foo` qualified +# references when re-traversing source via `-I src`). On a fresh checkout +# the package may not exist yet, so build it on demand. +if [[ ! -f tests/decimo.mojopkg ]]; then + echo "tests/decimo.mojopkg not found; building it now..." + pixi run mojo package src/decimo -o tests/decimo.mojopkg +fi + # ── Unit tests ───────────────────────────────────────────────────────────── for f in tests/cli/*.mojo; do pixi run mojo run -I tests -I src/cli -D ASSERT=all --debug-level=full "$f"