diff --git a/.ai-instructions b/.ai-instructions index 609ac4a8d..afbb98140 160000 --- a/.ai-instructions +++ b/.ai-instructions @@ -1 +1 @@ -Subproject commit 609ac4a8d9262f93594f36ea382d30cd94ea07a4 +Subproject commit afbb98140f3f47724eec2f689ea78953ddcd60f3 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 80b272c16..796f8dd51 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v6 - uses: prefix-dev/setup-pixi@v0.9.5 with: - pixi-version: v0.67.2 + pixi-version: v0.68.1 cache: true cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} environments: tests-cpu @@ -59,7 +59,7 @@ jobs: - uses: actions/checkout@v6 - uses: prefix-dev/setup-pixi@v0.9.5 with: - pixi-version: v0.67.2 + pixi-version: v0.68.1 cache: true cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} environments: type-checking @@ -82,7 +82,7 @@ jobs: - uses: actions/checkout@v6 - uses: prefix-dev/setup-pixi@v0.9.5 with: - pixi-version: v0.67.2 + pixi-version: v0.68.1 cache: true cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} environments: tests-cuda12 @@ -101,7 +101,7 @@ jobs: - uses: actions/checkout@v6 - uses: prefix-dev/setup-pixi@v0.9.5 with: - pixi-version: v0.67.2 + pixi-version: v0.68.1 cache: true cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} environments: tests-cuda12 @@ -116,7 +116,7 @@ jobs: # - uses: actions/checkout@v6 # - uses: prefix-dev/setup-pixi@v0.9.5 # with: - # pixi-version: v0.67.2 + # pixi-version: v0.68.1 # cache: true # cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} # environments: tests-cpu diff --git a/AGENTS.md b/AGENTS.md index b311ee198..21e9fcc86 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -275,13 +275,13 @@ loaded = SimulationResult.from_pickle("path/to/file.pkl") ### Initial Conditions Format -Initial conditions use a flat dictionary with state names plus `"regime"`: +Initial conditions use a flat dictionary with state names plus `"regime_id"`: ```python initial_conditions = { "wealth": jnp.array([1.0, 2.0, 3.0]), "health": jnp.array([0.5, 0.8, 0.3]), - "regime": jnp.array([RegimeId.working, RegimeId.working, RegimeId.retired]), + "regime_id": jnp.array([RegimeId.working, RegimeId.working, RegimeId.retired]), } ``` @@ -527,11 +527,16 @@ Code structure should be self-evident from function names and ordering. - **Helper function names follow `{verb}_{qualifier}_noun` patterns.** E.g., `get_irreg_coordinate`, `find_irreg_coordinate`, `get_linspace_coordinate` — not `get_coordinate_irreg`. -- **Use `@overload` when a function accepts both scalar and array inputs.** When a - function works with both `ScalarFloat` and `Array`, add overload declarations so the - type checker can track `(ScalarFloat) -> ScalarFloat` and `(Array) -> Array` - separately. Concrete subclass methods need their own overloads too (not just the - abstract base). +- **Pick the single narrowest jaxtyping alias — never scalar/array `@overload` pairs, + never `ScalarX | XND` unions.** ty erases jaxtyping shape annotations: `ScalarFloat`, + `Float1D`, and `FloatND` all reveal as `Array`, so scalar/array `@overload` pairs and + `ScalarFloat | FloatND`-style unions add zero static precision — they are pure noise. + At runtime, beartype treats a 0-d float array as satisfying both `ScalarFloat` and + `FloatND`, so `ScalarFloat ⊆ FloatND` and the union is redundant. Annotate each slot + with the one alias that matches its genuine rank: `ScalarFloat`/`ScalarInt` for + fixed-0-d, `Float1D`/`Int1D` for fixed-1-d, `FloatND`/`IntND` for genuinely rank- + polymorphic. Never use a bare `Array` annotation — always reach for the narrowest + `lcm.typing` alias. - **`func` for callable abbreviations** — use `func`, `func_name`, `func_params` (never `fn`). Full word `function(s)` in dataclass field names and public method names. - **Singular `state_names` / `action_names`** — not `states_names` / `actions_names`. diff --git a/benchmarks/_gpu_mem.py b/benchmarks/_gpu_mem.py index 45e328216..591b6ba18 100644 --- a/benchmarks/_gpu_mem.py +++ b/benchmarks/_gpu_mem.py @@ -26,6 +26,11 @@ class MahlerYumGpuPeakMem(GpuPeakMem): # Project root: the directory containing the benchmarks/ package. _PROJECT_ROOT = Path(__file__).resolve().parent.parent +# Marks the peak-memory line on the subprocess's stdout. The subprocess imports +# lcm, whose beartype claw can emit diagnostics to stdout, so the parent locates +# this line instead of parsing stdout wholesale. +_PEAK_MARKER = "__PEAK_BYTES_IN_USE__" + def measure_gpu_peak(bench_module: str, bench_class: str) -> int: """Run a benchmark in a subprocess and return peak GPU bytes. @@ -58,7 +63,15 @@ def measure_gpu_peak(bench_module: str, bench_class: str) -> int: f"stderr: {result.stderr!r}" ) raise RuntimeError(msg) - return int(result.stdout.strip()) + for line in result.stdout.splitlines(): + if line.startswith(_PEAK_MARKER): + return int(line.removeprefix(_PEAK_MARKER).strip()) + msg = ( + "GPU memory subprocess produced no peak-bytes line.\n" + f"stdout: {result.stdout!r}\n" + f"stderr: {result.stderr!r}" + ) + raise RuntimeError(msg) def _track_gpu_peak_mem(self): @@ -104,4 +117,4 @@ def setup(self): import jax stats = jax.local_devices()[0].memory_stats() - print(stats["peak_bytes_in_use"]) + print(f"{_PEAK_MARKER} {stats['peak_bytes_in_use']}") diff --git a/benchmarks/bench_mahler_yum.py b/benchmarks/bench_mahler_yum.py index fa8e3f6ba..046757a82 100644 --- a/benchmarks/bench_mahler_yum.py +++ b/benchmarks/bench_mahler_yum.py @@ -29,7 +29,7 @@ def _build(self): self.model_params = {"alive": common_params} self.initial_conditions = { **initial_states, - "regime": jnp.full( + "regime_id": jnp.full( _N_SUBJECTS, self.model.regime_names_to_ids["alive"], dtype=jnp.int32, diff --git a/benchmarks/bench_precautionary_savings.py b/benchmarks/bench_precautionary_savings.py index 5f02671bb..822d3747d 100644 --- a/benchmarks/bench_precautionary_savings.py +++ b/benchmarks/bench_precautionary_savings.py @@ -33,7 +33,7 @@ def _make_initial_conditions(n_subjects): "age": jnp.full(n_subjects, 20.0), "wealth": jnp.full(n_subjects, 5.0), "income": jnp.full(n_subjects, 0.0), - "regime": jnp.zeros(n_subjects, dtype=jnp.int32), + "regime_id": jnp.zeros(n_subjects, dtype=jnp.int32), } diff --git a/docs/development/benchmarking.md b/docs/development/benchmarking.md index 0d660e08a..8e6cc5748 100644 --- a/docs/development/benchmarking.md +++ b/docs/development/benchmarking.md @@ -129,7 +129,7 @@ class TimeMyModel: self.model_params = my_model.get_params() self.initial_conditions = { "wealth": jnp.full(1_000, 5.0), - "regime": jnp.zeros(1_000, dtype=jnp.int32), + "regime_id": jnp.zeros(1_000, dtype=jnp.int32), } # JIT warmup (timed separately) diff --git a/docs/examples/mahler_yum_2024.md b/docs/examples/mahler_yum_2024.md index 13cabbe99..4ce0df0a8 100644 --- a/docs/examples/mahler_yum_2024.md +++ b/docs/examples/mahler_yum_2024.md @@ -40,7 +40,7 @@ result = MAHLER_YUM_MODEL.simulate( params={"alive": params}, initial_conditions={ **initial_states, - "regime": jnp.full( + "regime_id": jnp.full( n_subjects, MAHLER_YUM_MODEL.regime_names_to_ids["alive"], ), diff --git a/docs/examples/mortality.md b/docs/examples/mortality.md index 8dcdf9c9b..687fb528b 100644 --- a/docs/examples/mortality.md +++ b/docs/examples/mortality.md @@ -26,7 +26,7 @@ result = model.simulate( initial_conditions={ "age": jnp.full(100, model.ages.values[0]), "wealth": jnp.linspace(1, 100, 100), - "regime": jnp.full(100, model.regime_names_to_ids["working_life"]), + "regime_id": jnp.full(100, model.regime_names_to_ids["working_life"]), }, period_to_regime_to_V_arr=None, seed=1234, diff --git a/docs/examples/precautionary_savings.md b/docs/examples/precautionary_savings.md index 4fe1c1568..6e92d327a 100644 --- a/docs/examples/precautionary_savings.md +++ b/docs/examples/precautionary_savings.md @@ -27,7 +27,7 @@ result = model.simulate( "age": jnp.full(100, model.ages.values[0]), "wealth": jnp.linspace(1, 10, 100), "income": jnp.zeros(100), - "regime": jnp.full(100, model.regime_names_to_ids["alive"]), + "regime_id": jnp.full(100, model.regime_names_to_ids["alive"]), }, period_to_regime_to_V_arr=None, ) diff --git a/docs/examples/precautionary_savings_health.md b/docs/examples/precautionary_savings_health.md index 7b4cf8b4d..38a244125 100644 --- a/docs/examples/precautionary_savings_health.md +++ b/docs/examples/precautionary_savings_health.md @@ -32,7 +32,7 @@ result = model.simulate( "age": jnp.full(1_000, model.ages.values[0]), "wealth": jnp.full(1_000, 1.0), "health": jnp.full(1_000, 1.0), - "regime": jnp.full(1_000, model.regime_names_to_ids["working_life"]), + "regime_id": jnp.full(1_000, model.regime_names_to_ids["working_life"]), }, period_to_regime_to_V_arr=None, ) diff --git a/docs/examples/tiny.md b/docs/examples/tiny.md index 24d64fb76..aa943d395 100644 --- a/docs/examples/tiny.md +++ b/docs/examples/tiny.md @@ -25,7 +25,7 @@ params = get_params() initial_df = pd.DataFrame( { - "regime": "working_life", + "regime_name": "working_life", "age": model.ages.values[0], "wealth": np.linspace(1, 20, 100), } diff --git a/docs/user_guide/benchmarking.md b/docs/user_guide/benchmarking.md index 85de82ddb..0140cfe97 100644 --- a/docs/user_guide/benchmarking.md +++ b/docs/user_guide/benchmarking.md @@ -91,7 +91,7 @@ class TimeSolveSimulate: self.initial_conditions = { "age": jnp.full(500, 25.0), "wealth": jnp.full(500, 5.0), - "regime": jnp.zeros(500, dtype=jnp.int32), + "regime_id": jnp.zeros(500, dtype=jnp.int32), } # --- JAX warmup -------------------------------------------------- diff --git a/docs/user_guide/pandas_interop.md b/docs/user_guide/pandas_interop.md index 5a04d8a2c..1bca397ab 100644 --- a/docs/user_guide/pandas_interop.md +++ b/docs/user_guide/pandas_interop.md @@ -12,12 +12,12 @@ is DataFrame in, DataFrame out. ## Initial Conditions as a DataFrame Pass a pandas DataFrame directly to `simulate()` as `initial_conditions`. One row per -agent, one column per state variable, plus a `"regime"` column: +agent, one column per state variable, plus a `"regime_name"` column: ```python df = pd.DataFrame( { - "regime": ["working", "working", "retired"], + "regime_name": ["working", "working", "retired"], "wealth": [10.0, 50.0, 30.0], "health": ["good", "bad", "good"], "age": [25.0, 25.0, 25.0], @@ -31,7 +31,7 @@ result = model.simulate( ) ``` -- `"regime"` column is required. Use regime names as strings (e.g., `"working"`). +- `"regime_name"` column is required. Use regime names as strings (e.g., `"working"`). - Discrete states use string labels from the model's categorical classes (e.g., `"good"` instead of `0`). Labels are validated and mapped to integer codes automatically. - Continuous states pass through as-is. diff --git a/docs/user_guide/solving_and_simulating.md b/docs/user_guide/solving_and_simulating.md index 873974fb1..e85d5aaac 100644 --- a/docs/user_guide/solving_and_simulating.md +++ b/docs/user_guide/solving_and_simulating.md @@ -74,7 +74,7 @@ import pandas as pd df = pd.DataFrame( { - "regime": ["working_life", "working_life", "retirement", "working_life"], + "regime_name": ["working_life", "working_life", "retirement", "working_life"], "age": [25.0, 25.0, 25.0, 25.0], "wealth": [1.0, 5.0, 10.0, 20.0], "health": ["good", "bad", "bad", "good"], # string labels, auto-converted @@ -102,7 +102,7 @@ initial_conditions = { "age": jnp.array([25.0, 25.0, 25.0, 25.0]), "wealth": jnp.array([1.0, 5.0, 10.0, 20.0]), "health": jnp.array([0, 1, 1, 0]), # integer codes for discrete states - "regime": jnp.array( + "regime_id": jnp.array( [ RegimeId.working_life, RegimeId.working_life, @@ -114,7 +114,7 @@ initial_conditions = { ``` - Every non-shock state must have an entry. -- `"regime"` must be included, with integer codes from the `regime_id_class`. +- `"regime_id"` must be included, with integer codes from the `regime_id_class`. - All arrays must have the same length (= number of agents). - Shock states are drawn automatically. @@ -140,7 +140,7 @@ Subjects can start at different ages: initial_conditions = { "age": jnp.array([40.0, 60.0]), "wealth": jnp.array([50.0, 50.0]), - "regime": jnp.array( + "regime_id": jnp.array( [ model.regime_names_to_ids["working_life"], model.regime_names_to_ids["working_life"], @@ -160,7 +160,7 @@ earlier periods are omitted, not filled with placeholders. df = result.to_dataframe() ``` -Returns a pandas DataFrame with columns: `subject_id`, `period`, `age`, `regime`, +Returns a pandas DataFrame with columns: `subject_id`, `period`, `age`, `regime_name`, `value`, plus all states and actions. Discrete variables are pandas Categorical with string labels. @@ -240,7 +240,7 @@ params = { # 3. Prepare initial conditions as a DataFrame initial_df = pd.DataFrame({ - "regime": "working_life", + "regime_name": "working_life", "age": model.ages.values[0], "wealth": np.linspace(1, 50, 100), }) diff --git a/pixi.lock b/pixi.lock index a73e96fba..d103c693d 100644 --- a/pixi.lock +++ b/pixi.lock @@ -20,26 +20,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda @@ -77,23 +77,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h235f0fe_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h50e9bb6_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h8a413ad_24.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -102,7 +102,7 @@ environments: - 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/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -116,9 +116,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -128,53 +128,53 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_19.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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -182,29 +182,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -220,23 +220,23 @@ environments: - 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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -253,15 +253,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -270,24 +270,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: git+https://github.com/OpenSourceEconomics/aca-model.git?rev=b807b286175e00f8a721f039f4afd657bbb10e2f#b807b286175e00f8a721f039f4afd657bbb10e2f + - pypi: git+https://github.com/OpenSourceEconomics/aca-model.git?rev=bce9101b049f4088789c19be14ab7b436daf44f7#bce9101b049f4088789c19be14ab7b436daf44f7 - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 - pypi: https://files.pythonhosted.org/packages/8d/2d/f61c918d9edc2127068f0d5ad4604fedd9bfd393f464219090f3279c73f7/estimagic-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/1f/5f4a3cd9e4440e9d9bc78ad0a91a1c8d46b4d429d5239ebe6793c9fe5c41/fsspec-2026.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/49/d4cad6e5381a50947bb973d2f6cf6592621451b09368b8c20d9b8af49c5b/greenlet-3.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/78/a3d9ceda0793f4fb43daa292af7b801932611a1aed442636ddfc93d58c7a/jax_cuda12_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/ec/9ba9f450f8a61c8388a3c8b74fe07d76230961aa6af65e7ed8d1bf9073fa/jax_cuda12_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/25/1f/cca084ca2572810fff12ea9dbdcbe39eac048f40daf4a9077b49fcbe8cee/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/c0/0a517bfe63ccd3b92eb254d264e28fca3c7cab75d07daea315250fb1bf73/nvidia_cublas_cu12-12.9.2.10-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -295,7 +297,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3c/8e/0c3aeef5f8a9507ad0b2d6fb3f28f38997cda1c7e7f614adc00ceb64a901/nvidia_cudnn_cu12-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/8f/2ede6b758b7524608472010f632bdd3370ea271d715d1d66044614b84cdc/nvidia_cudnn_cu12-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -304,16 +306,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/da/36fa8307cc40889307fed415d70b67d35ec330ffce889a9c03cf8f616cfa/nvidia_nvshmem_cu12-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/85/08c4e13a90a13c509d1fe09596dd8198338b6cfff9ee280f01ae7694889e/optimagic-0.5.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/1a/4834b1f2fb1847412353d7342eb7a1d001a4f3bd9d24155e057135a4aa44/optree-0.19.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/54/c30cb1d08258612ece1dfa72c6918998bebecb916c54fca6d806bc780f2b/pytask-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/84/efc7c0bf3a1c5eef81d397f6fddac855becdbb11cb38ff957888603014a7/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ @@ -337,26 +340,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda @@ -394,23 +397,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h235f0fe_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h50e9bb6_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h8a413ad_24.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -419,7 +422,7 @@ environments: - 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/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -433,9 +436,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -445,53 +448,53 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_19.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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -499,28 +502,28 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -536,23 +539,23 @@ environments: - 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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -569,15 +572,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -586,8 +589,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/78/a3d9ceda0793f4fb43daa292af7b801932611a1aed442636ddfc93d58c7a/jax_cuda12_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/ec/9ba9f450f8a61c8388a3c8b74fe07d76230961aa6af65e7ed8d1bf9073fa/jax_cuda12_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl @@ -601,7 +605,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3c/8e/0c3aeef5f8a9507ad0b2d6fb3f28f38997cda1c7e7f614adc00ceb64a901/nvidia_cudnn_cu12-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/8f/2ede6b758b7524608472010f632bdd3370ea271d715d1d66044614b84cdc/nvidia_cudnn_cu12-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -609,11 +613,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/da/36fa8307cc40889307fed415d70b67d35ec330ffce889a9c03cf8f616cfa/nvidia_nvshmem_cu12-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ cuda13: @@ -636,26 +640,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda @@ -693,23 +697,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.2.78-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.2-he2cc418_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he420e7e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h862fb80_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-h98b7566_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-he30e93d_24.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -718,7 +722,7 @@ environments: - 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/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -732,9 +736,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -744,53 +748,53 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.2.78-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.2.78-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -798,28 +802,28 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -835,23 +839,23 @@ environments: - 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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -868,15 +872,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -885,8 +889,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/98/77f15d81fd0637da454e453c8456d4a2b5c8b2e66823b4237ee8689152cf/jax_cuda13_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/2b/5c63c29d155afdf1d7827f8c04efe8cac47fc6783d8c53959e43de879dcc/jax_cuda13_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl @@ -894,14 +899,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/ec/c9b2998aebe3149dee2769e501257e048c8701de51263925f4dff76ddedc/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f8/79/0cefdaa1d9e45018a227bac64a79b92d2733cde28a8fd09c65362de08622/nvidia_cublas-13.4.1.1-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/92/87/d23db8276b76b4a7e4a702eebdc0a70e3b56c17b4dcd980ecb0f68b022e1/nvidia_cuda_cccl-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ea/78/501eee5cce9202fba2f3476529e296a7f6d003261d80b52ab0abfa09ddd6/nvidia_cuda_crt-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_x86_64.whl - pypi: https://files.pythonhosted.org/packages/65/0f/c7c7d538c61794130e759ad74710ab5aa8cab1f700ee1754381f8c665605/nvidia_cuda_nvcc-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/96/237b40b171e06eb65905375c4ad5c96f78c2f861ac6e8ae7f650d95e1dfd/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/dc/74/f1493b0774c6eaf0234512bb650e1ab90ce8f61fecf0b4aaf1fb416f571e/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/85/be/68e659d798aaad24817f10acbad952491b43df668376b704618296887f62/nvidia_cudnn_cu13-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/57/96/ce2cb84b5e8bb94dd55f554e3454b91e9ecd6708aa27d4a7b12f287613bc/nvidia_cudnn_cu13-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/36/3e/8d717a6e1f6e27b85b64650b1104dbcf6108c9dc7e27e9e26a0d8e936cc5/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/bd/bad43b37bcf13167637bef26399693d517b95092d742e8749eda5f4a85f3/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -910,11 +915,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/7b/2ab033584a3339552472ac8d79543c503a0e06dd0d082448b06697e7f716/nvidia_nvshmem_cu13-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e8/1f/930d63ccc8adcdf27bfc051a24e3e4da2cf6ef987848d6d1d642e29d704b/nvidia_nvvm-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ default: @@ -937,26 +942,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -973,7 +978,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.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/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -985,7 +990,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -994,7 +999,7 @@ environments: - 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/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -1008,9 +1013,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -1019,48 +1024,48 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.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/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -1068,28 +1073,28 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -1105,23 +1110,23 @@ environments: - 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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -1137,15 +1142,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -1154,19 +1159,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ osx-arm64: @@ -1182,26 +1188,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -1218,7 +1224,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -1230,7 +1236,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -1238,7 +1244,7 @@ environments: - 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/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -1252,83 +1258,83 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_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/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-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/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.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/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_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/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -1346,18 +1352,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -1377,15 +1383,15 @@ environments: - 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.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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -1394,19 +1400,20 @@ 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/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/25/e1e52a21786b321fb6a2edf9ef9971aa70f06bb2738aef9afd6d8f46a441/jaxlib-0.10.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ win-64: @@ -1420,26 +1427,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h8b39d88_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.0-h87b2689_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.13-h612f3e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h82175e6_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.2-h61b906f_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.38.3-h1db8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd63e0c5_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-h81bf7d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.13.0-h5ffce34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-hab49af2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -1457,7 +1464,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -1467,7 +1474,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_h0a39f1e_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -1475,7 +1482,7 @@ environments: - 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/ipykernel-7.2.0-pyh6dadd2b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyhe2676ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -1489,77 +1496,77 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-h37f918f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h8455456_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.20.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.4-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.5-h4fa8253_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_12.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.0.0-hac47afa_906.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2025.3.1-h57928b3_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.5-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_906.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_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/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.10-h18a1a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.4.0-h18a1a76_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -1574,11 +1581,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda @@ -1586,7 +1593,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -1601,26 +1608,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py314h5a2d7ad_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/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/win-64/vc-14.5-h1b7c187_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -1631,20 +1638,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/08/26e6a3ecf0a95f1ec0dcd7a668d5c9a72e581c40fe4ae51e102ca63174c5/jaxlib-0.10.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ docs: @@ -1667,26 +1675,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -1703,7 +1711,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.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/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -1715,7 +1723,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -1724,7 +1732,7 @@ environments: - 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/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -1734,14 +1742,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -1750,48 +1758,48 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.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/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libuv-1.51.0-hb03c661_1.conda @@ -1800,30 +1808,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.8.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.8.2-he4ff34a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -1839,23 +1847,23 @@ environments: - 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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -1871,15 +1879,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -1888,8 +1896,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -1897,15 +1906,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/8d/e12d6ff4b9119db3cbf7b2db1ce257576441bd3c76388c786dea74f20b02/numba-0.65.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ osx-arm64: @@ -1921,26 +1930,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -1957,7 +1966,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -1969,7 +1978,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -1978,7 +1987,7 @@ environments: - 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/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -1988,91 +1997,91 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_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/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-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/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.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/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_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/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.8.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.8.2-h7039424_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -2090,18 +2099,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -2121,15 +2130,15 @@ environments: - 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.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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -2138,8 +2147,9 @@ 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/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/25/e1e52a21786b321fb6a2edf9ef9971aa70f06bb2738aef9afd6d8f46a441/jaxlib-0.10.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -2147,15 +2157,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/a4/90edb01e9176053578e343d7a7276bc28356741ee67059aed8ed2c1a4e59/numba-0.65.0-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ win-64: @@ -2169,26 +2179,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h8b39d88_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.0-h87b2689_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.13-h612f3e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h82175e6_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.2-h61b906f_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.38.3-h1db8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd63e0c5_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-h81bf7d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.13.0-h5ffce34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-hab49af2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -2206,7 +2216,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -2216,7 +2226,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_h0a39f1e_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -2225,7 +2235,7 @@ environments: - 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/ipykernel-7.2.0-pyh6dadd2b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyhe2676ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -2235,66 +2245,66 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-h37f918f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h8455456_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.20.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h3cfd58e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-h8ef44ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.4-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.5-h4fa8253_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_12.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.8.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.0.0-hac47afa_906.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda @@ -2302,17 +2312,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.8.2-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2025.3.1-h57928b3_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.5-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_906.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_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/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.10-h18a1a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.4.0-h18a1a76_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -2327,11 +2337,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda @@ -2339,7 +2349,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -2354,26 +2364,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py314h5a2d7ad_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/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/win-64/vc-14.5-h1b7c187_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -2384,8 +2394,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/08/26e6a3ecf0a95f1ec0dcd7a668d5c9a72e581c40fe4ae51e102ca63174c5/jaxlib-0.10.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -2393,16 +2404,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/5b/fbce55ce3d933afbc7ade04df826853e4a846aaa47d58d2fbb669b8f2d08/numba-0.65.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/56/46/3f7fc04fb853559e74b210e0b62c19974ec844cefec611f9e535f4da3761/numba-0.65.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ metal: @@ -2426,26 +2437,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -2462,7 +2473,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -2474,7 +2485,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -2482,7 +2493,7 @@ environments: - 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/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -2496,83 +2507,83 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_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/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-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/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.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/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_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/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -2590,18 +2601,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -2621,15 +2632,15 @@ environments: - 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.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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -2638,8 +2649,9 @@ 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/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/dc/6d8fbfc29d902251cf333414cf7dcfaf4b252a9920c881354584ed36270d/jax_metal-0.1.1-py3-none-macosx_13_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a7/25/e1e52a21786b321fb6a2edf9ef9971aa70f06bb2738aef9afd6d8f46a441/jaxlib-0.10.0-cp314-cp314-macosx_11_0_arm64.whl @@ -2647,11 +2659,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl - pypi: ./ @@ -2675,26 +2687,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -2710,10 +2722,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_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/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.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/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -2726,7 +2738,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -2736,7 +2748,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -2750,9 +2762,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -2761,48 +2773,48 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.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/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -2810,29 +2822,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -2851,23 +2863,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -2883,15 +2895,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -2900,8 +2912,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -2909,15 +2922,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/8d/e12d6ff4b9119db3cbf7b2db1ce257576441bd3c76388c786dea74f20b02/numba-0.65.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ osx-arm64: @@ -2933,26 +2946,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -2968,10 +2981,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_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/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.14.0-py314h6e9b3f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -2984,7 +2997,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -2994,7 +3007,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -3008,84 +3021,84 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_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/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-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/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.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/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_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/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -3106,18 +3119,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -3137,15 +3150,15 @@ environments: - 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.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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -3154,8 +3167,9 @@ 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/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/25/e1e52a21786b321fb6a2edf9ef9971aa70f06bb2738aef9afd6d8f46a441/jaxlib-0.10.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -3163,15 +3177,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/a4/90edb01e9176053578e343d7a7276bc28356741ee67059aed8ed2c1a4e59/numba-0.65.0-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ win-64: @@ -3185,26 +3199,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h8b39d88_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.0-h87b2689_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.13-h612f3e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h82175e6_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.2-h61b906f_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.38.3-h1db8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd63e0c5_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-h81bf7d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.13.0-h5ffce34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-hab49af2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -3220,10 +3234,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_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/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.14.0-py314h2359020_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -3234,7 +3248,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_h0a39f1e_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -3244,7 +3258,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyhe2676ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -3258,78 +3272,78 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-h37f918f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h8455456_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.20.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h3cfd58e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-h8ef44ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.4-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.5-h4fa8253_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_12.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.0.0-hac47afa_906.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2025.3.1-h57928b3_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.5-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_906.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_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/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.10-h18a1a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.4.0-h18a1a76_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -3347,11 +3361,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda @@ -3359,7 +3373,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -3374,26 +3388,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py314h5a2d7ad_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/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/win-64/vc-14.5-h1b7c187_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -3404,8 +3418,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/08/26e6a3ecf0a95f1ec0dcd7a668d5c9a72e581c40fe4ae51e102ca63174c5/jaxlib-0.10.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -3413,16 +3428,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/5b/fbce55ce3d933afbc7ade04df826853e4a846aaa47d58d2fbb669b8f2d08/numba-0.65.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/56/46/3f7fc04fb853559e74b210e0b62c19974ec844cefec611f9e535f4da3761/numba-0.65.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ tests-cuda12: @@ -3445,26 +3460,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda @@ -3482,7 +3497,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_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/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda @@ -3504,7 +3519,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -3512,16 +3527,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h235f0fe_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h50e9bb6_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h8a413ad_24.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -3531,7 +3546,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -3545,9 +3560,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -3557,53 +3572,53 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_19.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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -3611,29 +3626,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -3652,23 +3667,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -3685,15 +3700,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -3702,8 +3717,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/78/a3d9ceda0793f4fb43daa292af7b801932611a1aed442636ddfc93d58c7a/jax_cuda12_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/ec/9ba9f450f8a61c8388a3c8b74fe07d76230961aa6af65e7ed8d1bf9073fa/jax_cuda12_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl @@ -3713,14 +3729,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/8d/e12d6ff4b9119db3cbf7b2db1ce257576441bd3c76388c786dea74f20b02/numba-0.65.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/c0/0a517bfe63ccd3b92eb254d264e28fca3c7cab75d07daea315250fb1bf73/nvidia_cublas_cu12-12.9.2.10-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c1/2e/b84e32197e33f39907b455b83395a017e697c07a449a2b15fd07fc1c9981/nvidia_cuda_cupti_cu12-12.9.79-py3-none-manylinux_2_25_x86_64.whl - pypi: https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b8/85/e4af82cc9202023862090bfca4ea827d533329e925c758f0cde964cb54b7/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bc/46/a92db19b8309581092a3add7e6fceb4c301a3fd233969856a8cbf042cd3c/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3c/8e/0c3aeef5f8a9507ad0b2d6fb3f28f38997cda1c7e7f614adc00ceb64a901/nvidia_cudnn_cu12-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/8f/2ede6b758b7524608472010f632bdd3370ea271d715d1d66044614b84cdc/nvidia_cudnn_cu12-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/95/f4/61e6996dd20481ee834f57a8e9dca28b1869366a135e0d42e2aa8493bdd4/nvidia_cufft_cu12-11.4.1.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/33/40/79b0c64d44d6c166c0964ec1d803d067f4a145cca23e23925fd351d0e642/nvidia_cusolver_cu12-11.7.5.82-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/46/b0fd4b04f86577921feb97d8e2cf028afe04f614d17fb5013de9282c9216/nvidia_cusparse_cu12-12.5.10.65-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -3728,13 +3744,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/da/36fa8307cc40889307fed415d70b67d35ec330ffce889a9c03cf8f616cfa/nvidia_nvshmem_cu12-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ tests-cuda13: @@ -3757,26 +3773,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda @@ -3794,7 +3810,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_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/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.2.75-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.2.78-ha770c72_0.conda @@ -3816,7 +3832,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.2.78-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.2-he2cc418_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -3824,16 +3840,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he420e7e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h862fb80_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-h98b7566_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-he30e93d_24.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -3843,7 +3859,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -3857,9 +3873,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -3869,53 +3885,53 @@ environments: - 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/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.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/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.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/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.2.78-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.2.78-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.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/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -3923,29 +3939,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -3964,23 +3980,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -3997,15 +4013,15 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -4014,8 +4030,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/98/77f15d81fd0637da454e453c8456d4a2b5c8b2e66823b4237ee8689152cf/jax_cuda13_pjrt-0.10.0-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/2b/5c63c29d155afdf1d7827f8c04efe8cac47fc6783d8c53959e43de879dcc/jax_cuda13_plugin-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl @@ -4025,15 +4042,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/8d/e12d6ff4b9119db3cbf7b2db1ce257576441bd3c76388c786dea74f20b02/numba-0.65.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3d/ec/c9b2998aebe3149dee2769e501257e048c8701de51263925f4dff76ddedc/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f8/79/0cefdaa1d9e45018a227bac64a79b92d2733cde28a8fd09c65362de08622/nvidia_cublas-13.4.1.1-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/92/87/d23db8276b76b4a7e4a702eebdc0a70e3b56c17b4dcd980ecb0f68b022e1/nvidia_cuda_cccl-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ea/78/501eee5cce9202fba2f3476529e296a7f6d003261d80b52ab0abfa09ddd6/nvidia_cuda_crt-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_x86_64.whl - pypi: https://files.pythonhosted.org/packages/65/0f/c7c7d538c61794130e759ad74710ab5aa8cab1f700ee1754381f8c665605/nvidia_cuda_nvcc-13.2.78-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/96/237b40b171e06eb65905375c4ad5c96f78c2f861ac6e8ae7f650d95e1dfd/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/dc/74/f1493b0774c6eaf0234512bb650e1ab90ce8f61fecf0b4aaf1fb416f571e/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/85/be/68e659d798aaad24817f10acbad952491b43df668376b704618296887f62/nvidia_cudnn_cu13-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/57/96/ce2cb84b5e8bb94dd55f554e3454b91e9ecd6708aa27d4a7b12f287613bc/nvidia_cudnn_cu13-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/36/3e/8d717a6e1f6e27b85b64650b1104dbcf6108c9dc7e27e9e26a0d8e936cc5/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/bd/bad43b37bcf13167637bef26399693d517b95092d742e8749eda5f4a85f3/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -4042,13 +4059,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/7b/2ab033584a3339552472ac8d79543c503a0e06dd0d082448b06697e7f716/nvidia_nvshmem_cu13-3.6.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e8/1f/930d63ccc8adcdf27bfc051a24e3e4da2cf6ef987848d6d1d642e29d704b/nvidia_nvvm-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ tests-metal: @@ -4072,26 +4089,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -4107,10 +4124,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_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/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.14.0-py314h6e9b3f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -4123,7 +4140,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -4132,7 +4149,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -4146,84 +4163,84 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_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/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-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/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.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/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_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/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -4244,18 +4261,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -4275,15 +4292,15 @@ environments: - 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.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.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -4292,8 +4309,9 @@ 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/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/dc/6d8fbfc29d902251cf333414cf7dcfaf4b252a9920c881354584ed36270d/jax_metal-0.1.1-py3-none-macosx_13_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a7/25/e1e52a21786b321fb6a2edf9ef9971aa70f06bb2738aef9afd6d8f46a441/jaxlib-0.10.0-cp314-cp314-macosx_11_0_arm64.whl @@ -4302,15 +4320,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/a4/90edb01e9176053578e343d7a7276bc28356741ee67059aed8ed2c1a4e59/numba-0.65.0-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl - pypi: ./ @@ -4335,26 +4353,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -4374,13 +4392,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda @@ -4395,7 +4413,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda @@ -4405,7 +4423,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -4415,7 +4433,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -4429,83 +4447,83 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_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/kiwisolver-1.5.0-py314h97ea11e_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_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/lerc-4.1.0-hdb68285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.4-default_h746c552_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.127-hb03c661_0.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/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_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/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_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/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.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/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.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/libglib-2.88.1-h0d30a3d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.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/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.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/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.4-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.5-hf7376ad_1.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/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.4-hd5a49e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_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.0-hf4e2dac_0.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/libssh2-1.11.1-hcf80075_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/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.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/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda @@ -4520,33 +4538,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py314hdafbbf9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py314hdafbbf9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpy-typing-compat-20251206.2.4-pyhd6139ff_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.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/optype-0.17.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.0-pyhada4073_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/optype-0.17.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.1-pyh3cfb546_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-3.0.0.260204-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_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/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda @@ -4554,7 +4572,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -4569,32 +4587,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py314h3987850_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.1-py314h3987850_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.1-pl5321h16c4a6b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/scipy-stubs-1.17.1.4-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda @@ -4611,19 +4629,19 @@ environments: - 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.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ty-0.0.32-h4e94fc0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.1.1.20260408-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ty-0.0.37-h4e94fc0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.2.0.20260506-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -4656,8 +4674,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a1/8e/b2a08ffc51c93842de71f7f988865cebfa7f43d6721957812dc8cc8b9d40/jaxlib-0.10.0-cp314-cp314-manylinux_2_27_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -4665,15 +4684,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/8d/e12d6ff4b9119db3cbf7b2db1ce257576441bd3c76388c786dea74f20b02/numba-0.65.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ osx-arm64: @@ -4689,26 +4708,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -4727,18 +4746,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.14.0-py314h6e9b3f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda @@ -4746,7 +4765,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314h658a3ac_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -4756,7 +4775,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -4770,62 +4789,62 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.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/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_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/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_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/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-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/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.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/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_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/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda @@ -4833,41 +4852,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.8-py314he55896b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.9-py314he55896b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.9-py314hc042b31_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpy-typing-compat-20251206.2.4-pyhd6139ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.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/optype-0.17.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.0-pyhada4073_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/optype-0.17.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.1-pyh3cfb546_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-3.0.0.260204-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.2.0-py314hab283cf_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/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -4890,11 +4909,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_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-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.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/pyyaml-6.0.3-py314h6e9b3f0_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda @@ -4902,7 +4921,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -4923,18 +4942,18 @@ environments: - 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.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.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ty-0.0.32-hdfcc030_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.1.1.20260408-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ty-0.0.37-hdfcc030_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.2.0.20260506-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_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/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -4946,8 +4965,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/25/e1e52a21786b321fb6a2edf9ef9971aa70f06bb2738aef9afd6d8f46a441/jaxlib-0.10.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -4955,15 +4975,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/a4/90edb01e9176053578e343d7a7276bc28356741ee67059aed8ed2c1a4e59/numba-0.65.0-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ win-64: @@ -4978,26 +4998,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h8b39d88_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.0-h87b2689_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.13-h612f3e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h82175e6_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.2-h61b906f_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.38.3-h1db8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd63e0c5_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-h81bf7d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.13.0-h5ffce34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-hab49af2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda @@ -5017,11 +5037,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.14.0-py314h2359020_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda @@ -5036,7 +5056,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda @@ -5044,7 +5064,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314h02517ec_102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_h0a39f1e_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -5054,7 +5074,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyhe2676ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -5068,60 +5088,60 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.19.1-hf2c6c5f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-h37f918f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h8455456_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.4-default_ha2db4b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.5-default_ha2db4b5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.20.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_1_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda @@ -5132,43 +5152,43 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-h8ef44ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.4-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.5-h4fa8253_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.8-py314h86ab7b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.9-py314h86ab7b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.9-py314hfa45d96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_12.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.0.0-hac47afa_906.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.5-py314h02f10f6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpy-typing-compat-20251206.2.4-pyhd6139ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2025.3.1-h57928b3_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_906.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/optype-0.17.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.0-pyhada4073_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/optype-0.17.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.1-pyh3cfb546_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-3.0.0.260204-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.2.0-py314h61b30b5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.10-h18a1a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.4.0-h18a1a76_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -5182,28 +5202,28 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.0-py314h447aaf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.1-py314h447aaf0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_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-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.0-pl5321hfcac499_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.1-pl5321hfcac499_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda @@ -5219,15 +5239,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py314h5a2d7ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ty-0.0.32-hc21aad4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.1.1.20260408-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ty-0.0.37-hc21aad4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.2.0.20260506-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_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/typing_utils-0.1.0-pyhd8ed1ab_1.conda @@ -5235,13 +5255,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-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/win-64/vc-14.5-h1b7c187_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_36.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda @@ -5255,8 +5275,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + - pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 + - pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/aa/dfac6d72cc35bc07e7587115b6946e333ef4ccb2e6cd26ecf639438c5d26/jax-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/08/26e6a3ecf0a95f1ec0dcd7a668d5c9a72e581c40fe4ae51e102ca63174c5/jaxlib-0.10.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/94/05/3e39d416fb92b2738a76e8265e6bfc5d10542f90a7c32ad1eb831eea3fa3/jaxtyping-0.3.9-py3-none-any.whl @@ -5264,16 +5285,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/5b/fbce55ce3d933afbc7ade04df826853e4a846aaa47d58d2fbb669b8f2d08/numba-0.65.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/56/46/3f7fc04fb853559e74b210e0b62c19974ec844cefec611f9e535f4da3761/numba-0.65.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/51/fe/53ac0cd932db5dcaf55961bc7cb7afdca8d80d8cc7406ed661f0c7dc111a/pdbp-1.8.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: ./ packages: @@ -5328,11 +5349,12 @@ packages: purls: [] size: 8191 timestamp: 1744137672556 -- pypi: git+https://github.com/OpenSourceEconomics/aca-model.git?rev=b807b286175e00f8a721f039f4afd657bbb10e2f#b807b286175e00f8a721f039f4afd657bbb10e2f +- pypi: git+https://github.com/OpenSourceEconomics/aca-model.git?rev=bce9101b049f4088789c19be14ab7b436daf44f7#bce9101b049f4088789c19be14ab7b436daf44f7 name: aca-model - version: 0.0.0 + version: 0.1.dev84+gbce9101b0 requires_dist: - attrs + - beartype - cloudpickle - dags - estimagic @@ -5582,57 +5604,57 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/attrs?source=compressed-mapping + - pkg:pypi/attrs?source=hash-mapping size: 64927 timestamp: 1773935801332 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda - sha256: 292aa18fe6ab5351710e6416fbd683eaef3aa5b1b7396da9350ff08efc660e4f - md5: 675ea6d90900350b1dcfa8231a5ea2dd +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda + sha256: ccbf2cc4bea4aab6e071d67ecc2743197759f6df855787e7a5f57f7973f913a2 + md5: 55eaf7066da1299d217ab32baedc7fa8 depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 - - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 134426 - timestamp: 1774274932726 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda - sha256: aba942578ad57e7b584434ed4e39c5ff7ed4ad3f326ac3eda26913ca343ea255 - md5: 1c701edc28f543a0e040325b223d5ca0 + size: 134427 + timestamp: 1777489423676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda + sha256: ce023981f49a96074bc84d6249c7097b71c27e8d3bd750fc07c520579159521c + md5: 4fbd86a4d1efeb954b0d559d6717bd2b depends: - __osx >=11.0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 116820 - timestamp: 1774275057443 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda - sha256: f937d40f01493c4799a673f56d70434d6cddb2ec967cf642a39e0e04282a9a1e - md5: 908d5d8755564e2c3f3770fca7ff0736 + size: 116717 + timestamp: 1777489477698 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h8b39d88_3.conda + sha256: ffa66e862ddcd8a825c3d44e83404daec7b8d36b7313650e09aa39443c312f5e + md5: 9f25944ccae498b7afbc81ce24f4c37a depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 127421 - timestamp: 1774275018076 + size: 127435 + timestamp: 1777489461908 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda sha256: f21d648349a318f4ae457ea5403d542ba6c0e0343b8642038523dd612b2a5064 md5: 3c3d02681058c3d206b562b2e3bc337f @@ -5739,124 +5761,124 @@ packages: purls: [] size: 23087 timestamp: 1767790877990 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda - sha256: 4a1a060ab40cb4fa39d24418758ca9faa1f51df6918f05143118e79bb11b4350 - md5: cd4946050ecfcb3c6fd09106ae6a261e +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + sha256: 9692edaeaf90f7710b7ec49c7ca42961c59344dafa6fadbaec8c283b0606ca68 + md5: 60076118b1579967748f0c9a2912de7c depends: - - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 + - libstdcxx >=14 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 58989 - timestamp: 1774270004533 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda - sha256: 8927fac75ad4cc4a2fbece5dbcc666cd6672a8ad87370cb183ff4d4f3e11f371 - md5: 228fe528ff814e420d8e13757f3c381e + size: 59054 + timestamp: 1774479894768 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + sha256: 454c02593d88246ac0fd4fc5e306147dd4f6c4866931c436ddeccdb37a70250f + md5: cb6d3b9905ffa47de2628e1ba9666c33 depends: - - libcxx >=19 - __osx >=11.0 - - aws-c-common >=0.12.6,<0.12.7.0a0 + - libcxx >=19 - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-checksums >=0.2.10,<0.2.11.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 53641 - timestamp: 1774270084862 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda - sha256: 63b7a1d3bfcfabeb5d4819c2577ff9fa93e28814ab63a5419740adf9b13a0f3a - md5: d2edd57e91a743151d816920cad61e54 + size: 53822 + timestamp: 1774480046539 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.0-h87b2689_0.conda + sha256: e826611d4ec8e9dc97fbf8ad7b6b54dc15ebd64b3a236be7e6bf8b898806d811 + md5: e116eed7dbaa4fcfae0f51c962440a81 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 57598 - timestamp: 1774270085349 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda - sha256: c6f910d400ef9034493988e8cd37bd4712e42d85921122bcda4ba68d4614b131 - md5: 7bc920933e5fb225aba86a788164a8f1 + size: 57651 + timestamp: 1774479982094 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + sha256: 38cfc8894db6729770ac18f900296c3f7c20f349a5586a8d8e1a62571fce61d5 + md5: 77f70a9ab785a146dbf66fba00131403 depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 + - libgcc >=14 - aws-c-compression >=0.3.2,<0.3.3.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 225868 - timestamp: 1774270031584 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda - sha256: b25380b43c2c5733dcaac88b075fa286893af1c147ca40d50286df150ace5fb8 - md5: 806ff124512457583d675c62336b1392 + size: 225826 + timestamp: 1774488399486 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + sha256: 7a008a5a2f76256e841a8565b373a7dcfd2a439e5d9dbec320322468637f69e5 + md5: fc4478bc51e76c5d26ea2c4f1e3ba366 depends: - __osx >=11.0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-compression >=0.3.2,<0.3.3.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 172940 - timestamp: 1774270153001 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda - sha256: dc297fbce04335f5f80b30bcdee1925ed4a0d95e7a2382523870c6b4981ca1b2 - md5: 26af0e9d7853d27e909ce01c287692b4 + size: 173575 + timestamp: 1774488444724 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.13-h612f3e8_0.conda + sha256: cf939d4a0849bc41421b4c380b2bbbc0beb1fd9b375bb9627b98d9415ec9ea69 + md5: 88626be3c14ac87c09629dcbf65e6279 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 207778 - timestamp: 1774270109581 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda - sha256: c66ebb7815949db72bab7c86bf477197e4bc6937c381cf32248bdd1ce496db00 - md5: dde6a3e4fe6bb2ecd2a7050dd1e701fb + size: 208426 + timestamp: 1774488477105 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + sha256: e3e33031d641864128ab11f9b8585ad5beb82fa988fe833bb0767dd01878a371 + md5: 14260392d0b491c537b5e26e9a506fff depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - - s2n >=1.7.1,<1.7.2.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - s2n >=1.7.2,<1.7.3.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 181624 - timestamp: 1773868304737 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda - sha256: 0e6ba2c8f250f466b9d671d3970e1f7c149c925b79c10fa7778708192a2a7833 - md5: 730d1cbd0973bd7ac150e181d3b572f3 + size: 181583 + timestamp: 1777471132287 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + sha256: e03ce71af986541d79fae88f7636d7a252b215d4560b47f005050dc9e1dc3c11 + md5: af3d15f053619ca43ea0943de01d368b depends: - __osx >=11.0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 177072 - timestamp: 1773868341204 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda - sha256: 3c9d50fb7895df4edd72d177299551608c24d8b0b82db0cf34c8e2bf6644979c - md5: ce36c60ed6b15c8dbb7ccddec4ebf57f + size: 176967 + timestamp: 1777471210683 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_1.conda + sha256: 77a9e9cbbea1ed76d02605955a8cf098d3793a8dc871b31b4617a8054f151639 + md5: d6091ef6857cee4f541716790de07b48 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 @@ -5866,102 +5888,102 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 182296 - timestamp: 1773868342627 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda - sha256: 3fc68793c0ca2c36524ae67abac696ce6b066a8be6b2b980cbdc40ae1310041a - md5: 8e77514673f5773b40ff8953583938b6 + size: 182289 + timestamp: 1777471159132 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + sha256: 236ab4138ff4600f95903d2da94125df78577055f6687afa8806db0f6ed2e1a8 + md5: 9120bc47b6f837f3cea90928c3e9a8fa depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - aws-c-io >=0.26.3,<0.26.4.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 221711 - timestamp: 1774275485771 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda - sha256: 69a12dfccdeb1497e3fbcaedea77c7adab854b482558aaa4ce5dea3a80d08c76 - md5: 1f4f6b9a183bea3ddf9af5ebcda0933d + size: 221638 + timestamp: 1777488145895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + sha256: 19a97f5d06ef994d7f48e77de3f998cc0a72d750d9363f2ba3894234c7bc799e + md5: 826c667323e95b2af0223641c69f327c depends: - __osx >=11.0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 156423 - timestamp: 1774275623505 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda - sha256: f99bf60673f0d5a143450009c9454087c9bca01be74ae08394f8fc47789fa56a - md5: fbccf4b054995b97bf98c38f0989a9a3 + size: 156329 + timestamp: 1777488187414 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h82175e6_2.conda + sha256: 96bf32162c9b4771a5193b27b93f5ef9aeb4c4d5ac5ea634de196e04e631f025 + md5: f0ef94911aacba679e072fb6bec80015 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 212290 - timestamp: 1774275592614 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda - sha256: c15869656f5fbebe27cc5aa58b23831f75d85502d324fedd7ee7e552c79b495d - md5: 4c5c16bf1133dcfe100f33dd4470998e + size: 212275 + timestamp: 1777488175661 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda + sha256: 4cecb4d595b7cf558087c37b8131cae5204b2c64d75f6b951dc3731d3f872bb8 + md5: 50ae8372984b8b98e056ac8f6b70ab29 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 + - __glibc >=2.17,<3.0.a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 - - openssl >=3.5.5,<4.0a0 - - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - openssl >=3.5.6,<4.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 151340 - timestamp: 1774282148690 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda - sha256: bd8f4ffb8346dd02bda2bc1ae9993ebdb131298b1308cb9e6b1e771b530d9dd5 - md5: f33735fd60f9c4a21c51a0283eb8afc1 + size: 152657 + timestamp: 1777824812393 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda + sha256: 236b4acfc8b0757e427087b53ebaf090190d106a7e73b6b1e8f80388988e89ac + md5: 7a520ebd6ae9efe641cb207b650d004c depends: - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 - - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 129783 - timestamp: 1774282252139 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda - sha256: 62367b6d4d8aa1b43fb63e51d779bb829dfdd53d908c1b6700efa23255dd38db - md5: 2d90128559ec4b3c78d1b889b8b13b50 + size: 131374 + timestamp: 1777824889044 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.2-h61b906f_1.conda + sha256: 8d9c747d71c493e6d5e5a125a267c6ac51baba1e4b89c01c2a4084239267b8e1 + md5: 2c4cd5a0bb004c9975a4d7257a55c34a depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-http >=0.10.12,<0.10.13.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-auth >=0.10.1,<0.10.2.0a0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 141733 - timestamp: 1774282227215 + size: 143057 + timestamp: 1777824834454 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda sha256: 9d62c5029f6f8219368a8665f0a549da572dc777f52413b7d75609cacdbc02cc md5: c7e3e08b7b1b285524ab9d74162ce40b @@ -6034,117 +6056,117 @@ packages: purls: [] size: 116853 timestamp: 1771063509650 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda - sha256: b82d0bc6d4b716347e1aefb0acc6e4bff04b3f807537ada9b458a7e467beb2a0 - md5: 798a499cf76e530a992365d557ba5827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + sha256: 5616649034662ab7846b78b344891f49b895807cabd83918aebb3439aa9ca405 + md5: 6a65b3595a8933808c03ff065dfb7702 depends: - - libgcc >=14 - - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-event-stream >=0.6.0,<0.6.1.0a0 - - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - libstdcxx >=14 + - libgcc >=14 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-s3 >=0.11.5,<0.11.6.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 410120 - timestamp: 1774286908570 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda - sha256: bb9e0abbe22825810776e4c6929f4587567b795272126aaca7e55b30c91f2d29 - md5: a13b36ec511c0589632e3689cd34ccc0 + size: 412541 + timestamp: 1778019077033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + sha256: 917ca9bcd9271a55be1c39dc1b07ce2e6c268c1fd507750d86138d98f708724a + md5: 40aa7f64708aef33749bcedd53d04d2e depends: - libcxx >=19 - __osx >=11.0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-mqtt >=0.15.2,<0.15.3.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-event-stream >=0.6.0,<0.6.1.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 - aws-c-auth >=0.10.1,<0.10.2.0a0 - - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 269460 - timestamp: 1774286981607 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda - sha256: 4a072a69e8b0a6552269cdf32831dc2cfa429a61c58edc5353f94dde09a3002f - md5: 81e1ff78b80119ec772bf28b30216f00 + size: 271073 + timestamp: 1778019218424 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.38.3-h1db8845_1.conda + sha256: f5b2630c36a2bcc9191f4e8507f33b952a8d1d95bab6e01f2ce8e91d10393c59 + md5: 11486baa17799f372477c636def4d51a depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-event-stream >=0.6.0,<0.6.1.0a0 - - aws-c-s3 >=0.11.5,<0.11.6.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 - aws-c-auth >=0.10.1,<0.10.2.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 304084 - timestamp: 1774286995597 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda - sha256: 62b7e565852fa061a26281b2890e432853fabefa8ea3dc22d00d39295a030805 - md5: cfffedbfd03d5a6bb74157c14b6f0cdf + size: 306413 + timestamp: 1778019104103 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda + sha256: f17585991350e00084614faaa704166a07fdcf58e80c76003e35111093c6e5e9 + md5: 169a79ea1127077d8dc36dc963ff55ac depends: - - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - libzlib >=1.3.1,<2.0a0 - - aws-crt-cpp >=0.37.4,<0.37.5.0a0 - - aws-c-event-stream >=0.6.0,<0.6.1.0a0 - - libcurl >=8.19.0,<9.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 + - libcurl >=8.20.0,<9.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3624521 - timestamp: 1773666645246 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda - sha256: b5ce4fafe17ab58980f944b9a45504ce45dda0423064591d51240eb8308589af - md5: 157ae2a6008d62f61107f5b78dce06d2 + size: 3624409 + timestamp: 1778156208464 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda + sha256: 29c21176bc47051ed20db066dc4917b1c9d8e209f936a1737998755061ee133f + md5: 45bb0d0e776ed7cd12597710058c2d50 depends: - - libcxx >=19 - __osx >=11.0 + - libcxx >=19 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 + - libcurl >=8.20.0,<9.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-event-stream >=0.6.0,<0.6.1.0a0 - - libcurl >=8.19.0,<9.0a0 - - libzlib >=1.3.1,<2.0a0 - - aws-crt-cpp >=0.37.4,<0.37.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3260974 - timestamp: 1773666675518 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda - sha256: b2ca74995fecfc1029f95c6256dea6d7e035e24633870a52665a8d48f49331f8 - md5: 48efab184702deb479a3766b1462efec + size: 3261086 + timestamp: 1778156290937 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd63e0c5_4.conda + sha256: 1d8f02b1eaeba71654692d7f7d8eede738fc7be9208ed22e0fe8406d5e621e58 + md5: 38bb9c437f8c362641bc102a74f487e1 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - libzlib >=1.3.1,<2.0a0 - - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-crt-cpp >=0.37.4,<0.37.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 23794273 - timestamp: 1773666686533 + size: 23790512 + timestamp: 1778158982457 - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda sha256: 321d1070905e467b6bc6f5067b97c1868d7345c272add82b82e08a0224e326f0 md5: 5492abf806c45298ae642831c670bba0 @@ -6224,50 +6246,50 @@ packages: purls: [] size: 424962 timestamp: 1770345047909 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda - sha256: cef75b91bdd5a65c560b501df78905437cc2090a64b4c5ecd7da9e08e9e9af7c - md5: 939d9ce324e51961c7c4c0046733dbb7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hf824e48_2.conda + sha256: ec278ffc9785cffeed097f57483fd0bc32c9083f56d7e6d95de46e560e4b49d1 + md5: 315c1c09f02a1efeb1b4d3dbcd2aa26a depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - azure-storage-common-cpp >=12.13.0,<12.13.1.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 579825 - timestamp: 1770321459546 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda - sha256: 9de2f050a49597e5b98b59bf90880e00bfdff79a3afbb18828565c3a645d62d6 - md5: f08b3b9d7333dc427b79897e6e3e7f29 + size: 580752 + timestamp: 1778727162545 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-h5446563_2.conda + sha256: 2ab2bc487d2cb985d2d45adbac7a6fe9a554bd78808268622566acb5e28fe5a2 + md5: 1ac96ad3d642a951b4576ea09ae502a3 depends: - __osx >=11.0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - azure-storage-common-cpp >=12.13.0,<12.13.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 426735 - timestamp: 1770322058844 -- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda - sha256: 654fae004aee8616a8ed4935a6fa703d629e4d1686a9fe431ef2e689846c0016 - md5: bc419192d40ca1b4928f70519d54b96c + size: 426524 + timestamp: 1778727625073 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-h81bf7d1_2.conda + sha256: 303e08ee92f09e98d23bfd8c566f9f46f50dc732792497833425b0f6f2a61fd1 + md5: cff26b4c1811a4cb84a8d3e5ff955650 depends: - azure-core-cpp >=1.16.2,<1.16.3.0a0 - - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - azure-storage-common-cpp >=12.13.0,<12.13.1.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 781612 - timestamp: 1770321543576 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda - sha256: ef7d1cae36910b21385d0816f8524a84dee1513e0306927e41a6bd32b5b9a0d0 - md5: 6400f73fe5ebe19fe7aca3616f1f1de7 + size: 782578 + timestamp: 1778727275165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.13.0-ha7a2c86_0.conda + sha256: 67fa6937bc2f6400f5ff19727f5d926fdc68d7fce3aaeab4016f49bb93d89cbb + md5: a7e8cca395e0a1616b389749580b7804 depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 @@ -6275,30 +6297,30 @@ packages: - libstdcxx >=14 - libxml2 - libxml2-16 >=2.14.6 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 license: MIT license_family: MIT purls: [] - size: 150405 - timestamp: 1770240307002 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda - sha256: 541be427e681d129c8722e81548d2e51c4b1a817f88333f3fbb3dcdef7eacafb - md5: b658a3fb0fc412b2a4d30da3fcec036f + size: 159140 + timestamp: 1778661935076 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.13.0-he467506_0.conda + sha256: bc73ce983d90baa732e6f64e4d8b4ddbb8e671c5d6e7b9475d33dbd118ddd5b6 + md5: 4cfc08976cf62fef7736a763652987cb depends: - __osx >=11.0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libcxx >=19 - libxml2 - libxml2-16 >=2.14.6 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 license: MIT license_family: MIT purls: [] - size: 121500 - timestamp: 1770240531430 -- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda - sha256: 98dfdd2d86d34b93a39d04a73eb4ca26cc0986bf20892005a66db13077eb4b86 - md5: 716715d06097dfd791b0bab525839910 + size: 128808 + timestamp: 1778662321258 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.13.0-h5ffce34_0.conda + sha256: a6c53ef367cfbee76793ea35160f902bd5d1ebebb579a7a53d6b4de3b2011b32 + md5: 40d5c4a1192882e4f6c4a59631f0d2d4 depends: - azure-core-cpp >=1.16.2,<1.16.3.0a0 - ucrt >=10.0.20348.0 @@ -6307,52 +6329,52 @@ packages: license: MIT license_family: MIT purls: [] - size: 246289 - timestamp: 1770240396492 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda - sha256: 55aa8ad5217d358e0ccf4a715bd1f9bafef3cd1c2ea4021f0e916f174c20f8e3 - md5: 6d10339800840562b7dad7775f5d2c16 + size: 256294 + timestamp: 1778662025067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h539c000_2.conda + sha256: 7765e9082b544555f74473ec21e366d92bb7688635d42d200860798e8b792a25 + md5: 245b61f9baef23f8f6cf04ccda928521 depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 - - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - azure-storage-common-cpp >=12.13.0,<12.13.1.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 302524 - timestamp: 1770384269834 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda - sha256: 1891df88b68768bc042ea766c1be279bff0fdaf471470bfa3fa599284dbd0975 - md5: 601ac4f945ba078955557edf743f1f78 + size: 302771 + timestamp: 1778763856084 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hdc9d693_2.conda + sha256: 77dde85d2c3c4c2f2a0a0cf6ac7e2b2458d60fe9a633e8fe934f0c9bfcbae168 + md5: 4dbee4ea590bf017fb7b2fba71b16b24 depends: - __osx >=11.0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 - - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - azure-storage-common-cpp >=12.13.0,<12.13.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 198153 - timestamp: 1770384528646 -- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda - sha256: 9941733f0f4b3a2649f534c71195c8e7a92984e9e9f17c7eb6d84803e3cdccf1 - md5: 64afdd17c4a6f4cb1d97caaad1fdc191 + size: 198818 + timestamp: 1778764243281 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-hab49af2_2.conda + sha256: 4ee09742ae920c02bf84926c63d339b9662785b5aec80963af709b1c139068f4 + md5: 8a63603563a73598ab7d632158be0aa1 depends: - azure-core-cpp >=1.16.2,<1.16.3.0a0 - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 - - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - azure-storage-common-cpp >=12.13.0,<12.13.1.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 438910 - timestamp: 1770384369008 + size: 439535 + timestamp: 1778763967002 - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 md5: f1976ce927373500cc19d3c0b2c85177 @@ -6364,19 +6386,125 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/babel?source=compressed-mapping + - pkg:pypi/babel?source=hash-mapping size: 7684321 timestamp: 1772555330347 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda noarch: generic - sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 - md5: a2ac7763a9ac75055b68f325d3255265 + sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe + md5: 1133126d840e75287d83947be3fc3e71 depends: - python >=3.14 license: BSD-3-Clause AND MIT AND EPL-2.0 - purls: [] - size: 7514 - timestamp: 1767044983590 + purls: + - pkg:pypi/backports-zstd?source=compressed-mapping + size: 7533 + timestamp: 1778594057496 +- pypi: https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl + name: beartype + version: 0.22.9 + sha256: d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2 + requires_dist: + - autoapi>=0.9.0 ; extra == 'dev' + - celery ; extra == 'dev' + - click ; extra == 'dev' + - coverage>=5.5 ; extra == 'dev' + - docutils>=0.22.0 ; extra == 'dev' + - equinox ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'dev' + - fastmcp ; python_full_version < '3.14' and extra == 'dev' + - jax[cpu] ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'dev' + - jaxtyping ; sys_platform == 'linux' and extra == 'dev' + - langchain ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'dev' + - mypy>=0.800 ; platform_python_implementation != 'PyPy' and extra == 'dev' + - nuitka>=1.2.6 ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'dev' + - numba ; python_full_version < '3.14' and extra == 'dev' + - numpy ; python_full_version < '3.15' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'dev' + - pandera>=0.26.0 ; python_full_version < '3.14' and extra == 'dev' + - poetry ; extra == 'dev' + - polars ; python_full_version < '3.14' and extra == 'dev' + - pydata-sphinx-theme<=0.7.2 ; extra == 'dev' + - pygments ; extra == 'dev' + - pyinstaller ; extra == 'dev' + - pyright>=1.1.370 ; extra == 'dev' + - pytest>=6.2.0 ; extra == 'dev' + - redis ; extra == 'dev' + - rich-click ; extra == 'dev' + - setuptools ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx>=4.2.0,<6.0.0 ; extra == 'dev' + - sphinxext-opengraph>=0.7.5 ; extra == 'dev' + - sqlalchemy ; extra == 'dev' + - torch ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'dev' + - tox>=3.20.1 ; extra == 'dev' + - typer ; extra == 'dev' + - typing-extensions>=3.10.0.0 ; extra == 'dev' + - xarray ; python_full_version < '3.15' and extra == 'dev' + - mkdocs-material[imaging]>=9.6.0 ; extra == 'doc-ghp' + - mkdocstrings-python-xref>=1.16.0 ; extra == 'doc-ghp' + - mkdocstrings-python>=1.16.0 ; extra == 'doc-ghp' + - autoapi>=0.9.0 ; extra == 'doc-rtd' + - pydata-sphinx-theme<=0.7.2 ; extra == 'doc-rtd' + - setuptools ; extra == 'doc-rtd' + - sphinx>=4.2.0,<6.0.0 ; extra == 'doc-rtd' + - sphinxext-opengraph>=0.7.5 ; extra == 'doc-rtd' + - celery ; extra == 'test' + - click ; extra == 'test' + - coverage>=5.5 ; extra == 'test' + - docutils>=0.22.0 ; extra == 'test' + - equinox ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test' + - fastmcp ; python_full_version < '3.14' and extra == 'test' + - jax[cpu] ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test' + - jaxtyping ; sys_platform == 'linux' and extra == 'test' + - langchain ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test' + - mypy>=0.800 ; platform_python_implementation != 'PyPy' and extra == 'test' + - nuitka>=1.2.6 ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test' + - numba ; python_full_version < '3.14' and extra == 'test' + - numpy ; python_full_version < '3.15' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test' + - pandera>=0.26.0 ; python_full_version < '3.14' and extra == 'test' + - poetry ; extra == 'test' + - polars ; python_full_version < '3.14' and extra == 'test' + - pygments ; extra == 'test' + - pyinstaller ; extra == 'test' + - pyright>=1.1.370 ; extra == 'test' + - pytest>=6.2.0 ; extra == 'test' + - redis ; extra == 'test' + - rich-click ; extra == 'test' + - sphinx ; extra == 'test' + - sqlalchemy ; extra == 'test' + - torch ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test' + - tox>=3.20.1 ; extra == 'test' + - typer ; extra == 'test' + - typing-extensions>=3.10.0.0 ; extra == 'test' + - xarray ; python_full_version < '3.15' and extra == 'test' + - celery ; extra == 'test-tox' + - click ; extra == 'test-tox' + - docutils>=0.22.0 ; extra == 'test-tox' + - equinox ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test-tox' + - fastmcp ; python_full_version < '3.14' and extra == 'test-tox' + - jax[cpu] ; python_full_version < '3.15' and sys_platform == 'linux' and extra == 'test-tox' + - jaxtyping ; sys_platform == 'linux' and extra == 'test-tox' + - langchain ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test-tox' + - mypy>=0.800 ; platform_python_implementation != 'PyPy' and extra == 'test-tox' + - nuitka>=1.2.6 ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test-tox' + - numba ; python_full_version < '3.14' and extra == 'test-tox' + - numpy ; python_full_version < '3.15' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and extra == 'test-tox' + - pandera>=0.26.0 ; python_full_version < '3.14' and extra == 'test-tox' + - poetry ; extra == 'test-tox' + - polars ; python_full_version < '3.14' and extra == 'test-tox' + - pygments ; extra == 'test-tox' + - pyinstaller ; extra == 'test-tox' + - pyright>=1.1.370 ; extra == 'test-tox' + - pytest>=6.2.0 ; extra == 'test-tox' + - redis ; extra == 'test-tox' + - rich-click ; extra == 'test-tox' + - sphinx ; extra == 'test-tox' + - sqlalchemy ; extra == 'test-tox' + - torch ; python_full_version < '3.14' and sys_platform == 'linux' and extra == 'test-tox' + - typer ; extra == 'test-tox' + - typing-extensions>=3.10.0.0 ; extra == 'test-tox' + - xarray ; python_full_version < '3.15' and extra == 'test-tox' + - coverage>=5.5 ; extra == 'test-tox-coverage' + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6 md5: 5267bef8efea4127aacd1f4e1f149b6e @@ -6729,7 +6857,7 @@ packages: - python >=3.10 license: ISC purls: - - pkg:pypi/certifi?source=compressed-mapping + - pkg:pypi/certifi?source=hash-mapping size: 135656 timestamp: 1776866680878 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda @@ -6788,13 +6916,13 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/charset-normalizer?source=compressed-mapping + - pkg:pypi/charset-normalizer?source=hash-mapping size: 58872 timestamp: 1775127203018 -- pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl name: click - version: 8.3.3 - sha256: a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613 + version: 8.4.0 + sha256: 40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 requires_dist: - colorama ; sys_platform == 'win32' requires_python: '>=3.10' @@ -6889,9 +7017,9 @@ packages: - pkg:pypi/contourpy?source=hash-mapping size: 247437 timestamp: 1769155978556 -- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda - sha256: cf5f98a291c3a5489cb299bae38711d5dc21b88a00df981f3b1528781e18c909 - md5: 78f547b78ace7541c4f54c4268ac9d2e +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.conda + sha256: 572f6f6527f35e214eb26d4d3d92b53af11b080de6958876f02b9288e518dfdf + md5: 7f8715a1928f6f126323320a4c5ada3a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -6902,11 +7030,11 @@ packages: license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping - size: 411308 - timestamp: 1773761119353 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.5-py314h6e9b3f0_0.conda - sha256: 808ebcb57027251f379f84e53a3755d2851918f78bdd512d131afe40ca64a041 - md5: cdbafe4a3e605024e7372c9580f9d734 + size: 414377 + timestamp: 1778445024489 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.14.0-py314h6e9b3f0_0.conda + sha256: 9b03482f61e8006dd2e113458727e7319932dea78cedbfea8a89df5d7a46d1d2 + md5: 70cf43e2d03269a3dfb33c284ce05dff depends: - __osx >=11.0 - python >=3.14,<3.15.0a0 @@ -6917,11 +7045,11 @@ packages: license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping - size: 412458 - timestamp: 1773761280047 -- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.5-py314h2359020_0.conda - sha256: 80a6a7be7eef784b8314a4cb563563c654e2180a0b2b31b232f79b2e7334aaf2 - md5: 849f0bd5b83d4fd59b41202b21bb3ca2 + size: 412814 + timestamp: 1778445420201 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.14.0-py314h2359020_0.conda + sha256: 340e6af5a19c091dabc334f9906e6ba2c5667721c90897ea878e05ee9f09fcf3 + md5: 25ce440d36bee2f53d5636a392dbe6f6 depends: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -6933,8 +7061,8 @@ packages: license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping - size: 438927 - timestamp: 1773760993379 + size: 437794 + timestamp: 1778444996415 - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda noarch: generic sha256: 40dc224f2b718e5f034efd2332bc315a719063235f63673468d26a24770094ee @@ -7418,10 +7546,9 @@ packages: purls: [] size: 210103 timestamp: 1771943128249 -- pypi: https://files.pythonhosted.org/packages/2c/c1/a662f0a8f6e024fca239d493f278d9adf5de1c8408af46a53a76beb13534/dags-0.5.1-py3-none-any.whl +- pypi: git+https://github.com/OpenSourceEconomics/dags.git?branch=main#87ff051077f37470514808a3121e7c90429f6383 name: dags - version: 0.5.1 - sha256: e9fd9fbe0536784fe8b8ce58ea194801b1de39d7364941d4a1f2d8240c14123d + version: 0.5.2.dev1+g87ff05107 requires_dist: - flatten-dict - networkx>=3.6 @@ -7485,17 +7612,16 @@ packages: - pkg:pypi/debugpy?source=hash-mapping size: 4026404 timestamp: 1769745008861 -- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 - md5: 9ce473d1d1be1cc3810856a48b3fab32 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.0-pyhd8ed1ab_0.conda + sha256: 78df51c83107eced84a6d07643fa9d8da2e93384208cc1941bad0da2c9cf8b07 + md5: ed5e04c929dc7c8bd57684aa14fa5693 depends: - - python >=3.9 + - python >=3.10 license: BSD-2-Clause - license_family: BSD purls: - - pkg:pypi/decorator?source=hash-mapping - size: 14129 - timestamp: 1740385067843 + - pkg:pypi/decorator?source=compressed-mapping + size: 16435 + timestamp: 1779011007912 - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be md5: 961b3a227b437d82ad7054484cfa71b2 @@ -7598,18 +7724,14 @@ packages: - python >=3.10 license: Unlicense purls: - - pkg:pypi/filelock?source=compressed-mapping + - pkg:pypi/filelock?source=hash-mapping size: 34211 timestamp: 1776621506566 -- pypi: https://files.pythonhosted.org/packages/43/f5/ee39c6e92acc742c052f137b47c210cd0a1b72dcd3f98495528bb4d27761/flatten_dict-0.4.2-py2.py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/72/9f/485516087cd8c44183aaf9ab850247a28e2e4a42a4d62eab77c21f673450/flatten_dict-0.5.0-py3-none-any.whl name: flatten-dict - version: 0.4.2 - sha256: 7e245b20c4c718981212210eec4284a330c9f713e632e98765560e05421e48ad - requires_dist: - - importlib-metadata ; python_full_version < '3.8' - - pathlib2>=2.3,<3.0 ; python_full_version < '3.4' - - six>=1.12,<2.0 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' + version: 0.5.0 + sha256: c4bd2010052e4d33241433720d054322403fa7ad914fdc5cb1b31a713d4c561e + requires_python: '>=3.10,<4.0' - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -7698,9 +7820,9 @@ packages: purls: [] size: 4059 timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda - sha256: fa77109df37580ce0933d4e6c5a44b2f0c192af2f8e503bfdbfb3b49a8b8e538 - md5: 14cf1ac7a1e29553c6918f7860aab6d8 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda + sha256: c9752235f1ff7061d834e5e4a3d0adf71ebeeff2b3fad82dab607edce7f70c91 + md5: 0509ee74d95e5b98eb6fe2a47760e399 depends: - brotli - munkres @@ -7712,8 +7834,8 @@ packages: license_family: MIT purls: - pkg:pypi/fonttools?source=compressed-mapping - size: 840293 - timestamp: 1776708212291 + size: 846038 + timestamp: 1778770337113 - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 md5: d3549fd50d450b6d9e7dddff25dd2110 @@ -7756,10 +7878,10 @@ packages: purls: [] size: 185640 timestamp: 1774300487600 -- pypi: https://files.pythonhosted.org/packages/d5/1f/5f4a3cd9e4440e9d9bc78ad0a91a1c8d46b4d429d5239ebe6793c9fe5c41/fsspec-2026.3.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl name: fsspec - version: 2026.3.0 - sha256: d2ceafaad1b3457968ed14efa28798162f1638dbb5d2a6868a2db002a5ee39a4 + version: 2026.4.0 + sha256: 11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2 requires_dist: - adlfs ; extra == 'abfs' - adlfs ; extra == 'adl' @@ -7864,43 +7986,43 @@ packages: - zstandard ; python_full_version < '3.14' and extra == 'test-full' - tqdm ; extra == 'tqdm' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - sha256: 3b31a273b806c6851e16e9cf63ef87cae28d19be0df148433f3948e7da795592 - md5: 30bb690150536f622873758b0e8d6712 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h235f0fe_19.conda + sha256: 1e2500ca976d4831c953d1c6db7b238d2e6806910b930e3eb631b79ba5c3ba41 + md5: 99936dc616b7ce97b0468759b8a7c64e depends: - binutils_impl_linux-64 >=2.45 - libgcc >=14.3.0 - - libgcc-devel_linux-64 14.3.0 hf649bbc_118 + - libgcc-devel_linux-64 14.3.0 hf649bbc_119 - libgomp >=14.3.0 - - libsanitizer 14.3.0 h8f1669f_18 + - libsanitizer 14.3.0 h8f1669f_19 - libstdcxx >=14.3.0 - - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118 + - libstdcxx-devel_linux-64 14.3.0 h9f08a49_119 - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 76302378 - timestamp: 1771378056505 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he420e7e_18.conda - sha256: a088cfd3ae6fa83815faa8703bc9d21cc915f17bd1b51aac9c16ddf678da21e4 - md5: cf56b6d74f580b91fd527e10d9a2e324 + size: 77667192 + timestamp: 1778268558509 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + sha256: a48400ec4b73369c1c59babe4ad35821b63a88bba0ec40a80cea5f8c53a26b83 + md5: e3be72048d3c4a78b8e27ec48ba06252 depends: - binutils_impl_linux-64 >=2.45 - libgcc >=15.2.0 - - libgcc-devel_linux-64 15.2.0 hcc6f6b0_118 + - libgcc-devel_linux-64 15.2.0 hcc6f6b0_119 - libgomp >=15.2.0 - - libsanitizer 15.2.0 h90f66d4_18 + - libsanitizer 15.2.0 h90f66d4_19 - libstdcxx >=15.2.0 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_118 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 81814135 - timestamp: 1771378369317 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - sha256: b535da55f53ed0e44a366295dad325b242958fb3d91ba84b0173bfae28b39793 - md5: b6090b005c6e1947e897c926caac1286 + size: 81180457 + timestamp: 1778269124617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h50e9bb6_24.conda + sha256: 5f73bc0ce1729466f99d072678fb1bc13d5424d03a34cb2e69fbafbfd5e27ab2 + md5: 91b0f19212d79a1a4dca034aac729e4f depends: - gcc_impl_linux-64 14.3.0.* - binutils_linux-64 @@ -7908,11 +8030,11 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 28912 - timestamp: 1775508892545 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h862fb80_23.conda - sha256: 15baa12c7c1f9540525b1cee4e6d42bc26c632aed7088eecf89b9d22b8b94d81 - md5: 3251d2b55a91af721d3d6924c45d6bb1 + size: 29073 + timestamp: 1777144725126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_24.conda + sha256: 7e1a77123819f9e6c15439df9a987c66235c53e4c6d12a9ab3cea883258214df + md5: 81f96ca8673107e2da4a6b9e3807cf74 depends: - gcc_impl_linux-64 15.2.0.* - binutils_linux-64 @@ -7920,8 +8042,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 28920 - timestamp: 1775508945710 + size: 29081 + timestamp: 1777144726741 - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a md5: d411fc29e338efb48c5fd4576d71d881 @@ -7993,10 +8115,10 @@ packages: purls: [] size: 96336 timestamp: 1755102441729 -- pypi: https://files.pythonhosted.org/packages/07/49/d4cad6e5381a50947bb973d2f6cf6592621451b09368b8c20d9b8af49c5b/greenlet-3.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: greenlet - version: 3.4.0 - sha256: 4df3b0b2289ec686d3c821a5fee44259c05cfe824dd5e6e12c8e5f5df23085cf + version: 3.5.0 + sha256: 8f52a464e4ed91780bdfbbdd2b97197f3accaa629b98c200f4dffada759f3ae7 requires_dist: - sphinx ; extra == 'docs' - furo ; extra == 'docs' @@ -8004,58 +8126,58 @@ packages: - psutil ; extra == 'test' - setuptools ; extra == 'test' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - sha256: 38ffca57cc9c264d461ac2ce9464a9d605e0f606d92d831de9075cb0d95fc68a - md5: 6514b3a10e84b6a849e1b15d3753eb22 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_19.conda + sha256: a31694c26d6a525d44f81130ebf7b9abe18771b7eaecb2cf93630c0b8b8fb936 + md5: 8b867d053ed89743eeac52c3a50f112d depends: - - gcc_impl_linux-64 14.3.0 hbdf3cc3_18 - - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118 + - gcc_impl_linux-64 14.3.0 h235f0fe_19 + - libstdcxx-devel_linux-64 14.3.0 h9f08a49_119 - sysroot_linux-64 - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 14566100 - timestamp: 1771378271421 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda - sha256: 48946f1f43d699b68123fb39329ef5acf3d9cbf8f96bdb8fb14b6197f5402825 - md5: e39123ab71f2e4cf989aa6aa5fafdaaf + size: 15235650 + timestamp: 1778268773535 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + sha256: 3f5288346b9fe233352443b3c2e31f1fde845e39d3e96475fc05ec2e782af158 + md5: 9d41f3899b512199af0a4bb939b83e21 depends: - - gcc_impl_linux-64 15.2.0 he420e7e_18 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_118 + - gcc_impl_linux-64 15.2.0 he0086c7_19 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 - sysroot_linux-64 - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 15587873 - timestamp: 1771378609722 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - sha256: 8a6a78d354fd259906b2f01f5c29c4f9e42878fa870eadc20f7251d4554a4445 - md5: 12d093c7df954a01b396a748442bd5cb + size: 16356816 + timestamp: 1778269332159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h8a413ad_24.conda + sha256: 66e357fad69998624d24ed52d7e1550f8159dc78418fff044377790f29e0fee3 + md5: ea3921760f33250a1c12926fce1660eb depends: - gxx_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_23 + - gcc_linux-64 ==14.3.0 h50e9bb6_24 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 27479 - timestamp: 1775508892545 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-h98b7566_23.conda - sha256: b42e47b9e3a549be01606e09bd070d18d24a7cc5437e51ea52d39759c1417764 - md5: 249806b139b4f6178475d39938182875 + size: 27606 + timestamp: 1777144725126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-he30e93d_24.conda + sha256: 9b40af502e2471ceff9a04a860165d8a6fac659c07dc115ed8357e1a77e2cbe7 + md5: 0787df5104bd63d2186dd3902244e7c3 depends: - gxx_impl_linux-64 15.2.0.* - - gcc_linux-64 ==15.2.0 h862fb80_23 + - gcc_linux-64 ==15.2.0 h7be306e_24 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 27474 - timestamp: 1775508945710 + size: 27602 + timestamp: 1777144726741 - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb md5: b8993c19b0c32a2f7b66cbb58ca27069 @@ -8066,7 +8188,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/h11?source=compressed-mapping + - pkg:pypi/h11?source=hash-mapping size: 39069 timestamp: 1767729720872 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -8151,6 +8273,7 @@ packages: - libstdcxx >=14 - libzlib >=1.3.2,<2.0a0 license: MIT + license_family: MIT purls: [] size: 2333599 timestamp: 1776778392713 @@ -8170,78 +8293,79 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT + license_family: MIT purls: [] size: 1322557 timestamp: 1776778816190 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda - sha256: c6ff674a4a5a237fcf748fed8f64e79df54b42189986e705f35ba64dc6603235 - md5: 1d92558abd05cea0577f83a5eca38733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda + sha256: beb8a2fb18924ca7b5b82cfb50f008f882f577daef2c00ed88022abea35fec76 + md5: 0d0595612fa229dddb5fc565c260a11f depends: - __glibc >=2.17,<3.0.a0 - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - libaec >=1.1.5,<2.0a0 - - libcurl >=8.19.0,<9.0a0 + - libcurl >=8.20.0,<9.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - libstdcxx >=14 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 4138489 - timestamp: 1775243967708 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda - sha256: 5b96accf983be97718fbfaddd6706591d7ef6511b4ccdac8a09f6b9899d1b284 - md5: e5390fd4a3b964a3ed619480df918294 + size: 4713397 + timestamp: 1777861887131 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_he586413_105.conda + sha256: 518237c7e1e1f1f2d98f0283a483571b2d62c5c71b455a0ad0f0cc40087bb939 + md5: deb297adb6083474bb8b75b92172fb95 depends: - __osx >=11.0 - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - libaec >=1.1.5,<2.0a0 - - libcurl >=8.19.0,<9.0a0 + - libcurl >=8.20.0,<9.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3418702 - timestamp: 1775244340092 -- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda - sha256: ad660bf000e2a905ebdc8c297d9b3851ac48834284b673e655adda490425f652 - md5: 37c1890c40a1514fa92ba13e27d5b1c3 + size: 3319915 + timestamp: 1777861894583 +- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_h0a39f1e_105.conda + sha256: 2f2d49ccf163a4bdf556662fb2949bdf408940e2db67a2d15be2d8be247b6e43 + md5: d5850b9e97b9a577441067628fb8d573 depends: - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 - aws-c-io >=0.26.3,<0.26.4.0a0 - - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - libaec >=1.1.5,<2.0a0 - - libcurl >=8.19.0,<9.0a0 + - libcurl >=8.20.0,<9.0a0 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] - size: 2564561 - timestamp: 1775244102272 + size: 2599543 + timestamp: 1777861984545 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba md5: 0a802cb9888dd14eeefc611f05c40b6e @@ -8337,8 +8461,9 @@ packages: - python >=3.10 - python license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/idna?source=compressed-mapping + - pkg:pypi/idna?source=hash-mapping size: 59038 timestamp: 1776947141407 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda @@ -8351,7 +8476,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=compressed-mapping + - pkg:pypi/importlib-metadata?source=hash-mapping size: 34387 timestamp: 1773931568510 - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -8362,7 +8487,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/iniconfig?source=compressed-mapping + - pkg:pypi/iniconfig?source=hash-mapping size: 13387 timestamp: 1760831448842 - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda @@ -8447,50 +8572,54 @@ packages: - pkg:pypi/ipykernel?source=hash-mapping size: 133644 timestamp: 1770566133040 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda - sha256: a0d3e4c8e4d7b3801377a03de32951f68d77dd1bfe25082c7915f4e6b0aaa463 - md5: 3734e3b6618ea6e04ad08678d8ed7a45 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda + sha256: a0af49948a1842dfd15a0b0b2fd56c94ddbd07e07a6c8b4bc70d43015eafaff0 + md5: 73e9657cd19605740d21efb14d8d0cb9 depends: - - __win + - __unix - decorator >=5.1.0 - ipython_pygments_lexers >=1.0.0 - jedi >=0.18.2 - matplotlib-inline >=0.1.6 - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 - pygments >=2.14.0 - - python >=3.12 + - python >=3.11 - stack_data >=0.6.0 - traitlets >=5.13.0 - - colorama >=0.4.4 + - typing_extensions >=4.6 + - pexpect >4.6 - python license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ipython?source=compressed-mapping - size: 648954 - timestamp: 1774610078420 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - sha256: 932044bd893f7adce6c9b384b96a72fd3804cc381e76789398c2fae900f21df7 - md5: b293210beb192c3024683bf6a998a0b8 + - pkg:pypi/ipython?source=hash-mapping + size: 651632 + timestamp: 1777038396606 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyhe2676ad_0.conda + sha256: f252ec33597115ff21cbb31051f6f9be34ca36cbbbf3d266b597660d8d8edde9 + md5: 5631ab99e902463d9dd4221e5b4eab6d depends: - - __unix + - __win - decorator >=5.1.0 - ipython_pygments_lexers >=1.0.0 - jedi >=0.18.2 - matplotlib-inline >=0.1.6 - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 - pygments >=2.14.0 - - python >=3.12 + - python >=3.11 - stack_data >=0.6.0 - traitlets >=5.13.0 - - pexpect >4.6 + - typing_extensions >=4.6 + - colorama >=0.4.4 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipython?source=hash-mapping - size: 649967 - timestamp: 1774609994657 + size: 650593 + timestamp: 1777038425499 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 md5: bd80ba060603cc228d9d81c257093119 @@ -8677,7 +8806,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jinja2?source=compressed-mapping + - pkg:pypi/jinja2?source=hash-mapping size: 120685 timestamp: 1764517220861 - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl @@ -8693,7 +8822,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/json5?source=compressed-mapping + - pkg:pypi/json5?source=hash-mapping size: 34731 timestamp: 1774655440045 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda @@ -8756,9 +8885,9 @@ packages: purls: [] size: 4740 timestamp: 1767839954258 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda - sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 - md5: 6466d205c69ad4f33ac9100a93af55b5 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-2.1.5-pyhcf101f3_0.conda + sha256: 398ebf0ec7a445ff4a423d4cd322d8307167adbe304bc7012cf4fb5a351daf68 + md5: 59d77abab8772f3f677bf71ad0af0ddc depends: - ipykernel - jupyter_core @@ -8771,8 +8900,8 @@ packages: license_family: BSD purls: - pkg:pypi/jupyter-book?source=hash-mapping - size: 2179593 - timestamp: 1775073480141 + size: 2179874 + timestamp: 1777706555599 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e md5: 0c3b465ceee138b9c39279cc02e5c4a0 @@ -8801,7 +8930,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jupyter-client?source=compressed-mapping + - pkg:pypi/jupyter-client?source=hash-mapping size: 112785 timestamp: 1767954655912 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda @@ -8855,13 +8984,14 @@ packages: - traitlets >=5.3 - python license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/jupyter-events?source=compressed-mapping + - pkg:pypi/jupyter-events?source=hash-mapping size: 24002 timestamp: 1776861872237 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - sha256: 74c4e642be97c538dae1895f7052599dfd740d8bd251f727bce6453ce8d6cd9a - md5: d79a87dcfa726bcea8e61275feed6f83 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.18.2-pyhcf101f3_0.conda + sha256: 04fb8ea7749f67abaf76df6257bf86688e1389ceed55eb4fb0176fd2e882dbd6 + md5: 5ee7945accf0f215ddd6055d25d7cd83 depends: - anyio >=3.1.0 - argon2-cffi >=21.1 @@ -8887,8 +9017,8 @@ packages: license_family: BSD purls: - pkg:pypi/jupyter-server?source=hash-mapping - size: 347094 - timestamp: 1755870522134 + size: 360522 + timestamp: 1778060967727 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654 md5: 7b8bace4943e0dc345fc45938826f2b8 @@ -8902,9 +9032,9 @@ packages: - pkg:pypi/jupyter-server-terminals?source=hash-mapping size: 22052 timestamp: 1768574057200 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda - sha256: 436a70259a9b4e13ce8b15faa8b37342835954d77a0a74d21dd24547e0871088 - md5: bcbb401d6fa84e0cee34d4926b0e9e93 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.7-pyhd8ed1ab_0.conda + sha256: b85befad5ba1f50c0cc042a2ffb26441d13ffc2f18572dc20d3541476da0c7b9 + md5: 2ffe77234070324e763a6eddabb5f467 depends: - async-lru >=1.0.0 - httpx >=0.25.0,<1 @@ -8925,8 +9055,8 @@ packages: license_family: BSD purls: - pkg:pypi/jupyterlab?source=hash-mapping - size: 8245973 - timestamp: 1773240966438 + size: 8861204 + timestamp: 1777483115382 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 md5: fd312693df06da3578383232528c468d @@ -9079,36 +9209,36 @@ packages: - pkg:pypi/lark?source=hash-mapping size: 94312 timestamp: 1761596921009 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda - sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a - md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 + md5: f92f984b558e6e6204014b16d212b271 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libjpeg-turbo >=3.1.2,<4.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT purls: [] - size: 249959 - timestamp: 1768184673131 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda - sha256: d768da024ab74a4b30642401877fa914a68bdc238667f16b1ec2e0e98b2451a6 - md5: 6631a7bd2335bb9699b1dbc234b19784 + size: 251086 + timestamp: 1778079286384 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda + sha256: d589ff5294e42576563b22bdea0860cb80b0cbe0f3852836eddaadedf6eec4ef + md5: e5ba982008c0ac1a1c0154617371bab5 depends: - __osx >=11.0 - - libjpeg-turbo >=3.1.2,<4.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT purls: [] - size: 211756 - timestamp: 1768184994800 -- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda - sha256: 7eeb18c5c86db146b62da66d9e8b0e753a52987f9134a494309588bbeceddf28 - md5: b6c68d6b829b044cd17a41e0a8a23ca1 + size: 212998 + timestamp: 1778079809873 +- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.19.1-hf2c6c5f_0.conda + sha256: 57ecd32470a2607db238e631cda6d160ad65451715065fc4449acb11fe48fe28 + md5: 29f2c366a0da954bafd69a0d549c0ab3 depends: - - libjpeg-turbo >=3.1.2,<4.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -9116,8 +9246,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 522238 - timestamp: 1768184858107 + size: 523813 + timestamp: 1778079433472 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c md5: 18335a698559cdbcd86150a48bf54ba6 @@ -9245,12 +9375,13 @@ packages: purls: [] size: 34463 timestamp: 1769221960556 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda - sha256: 0117df14b22d795ee56d5fc08ceabc14e12fa9c93d64979e3616260225ed30ca - md5: 8aeb79715524b48267068fb0fd185956 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + build_number: 1 + sha256: d2325979993c71580e571eaa470e0ca33b86acb23c653909fecaef688a1c44b4 + md5: aed984d45692d6211ebf013b62c9fa02 depends: - __glibc >=2.17,<3.0.a0 - - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - azure-identity-cpp >=1.13.3,<1.13.4.0a0 @@ -9278,15 +9409,17 @@ packages: - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 6496823 - timestamp: 1776815770895 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h2124f06_0_cpu.conda - sha256: 58715feab991b36d659a3432faf41abaea6a3320e184b63b7d0961e86c6598fe - md5: 1b5a248fdad0e0744b512a5590bfb090 + size: 6508876 + timestamp: 1778175634414 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + build_number: 1 + sha256: 814e775718a3ccafcbcd704b11dc402374513ec6f66241780ff7ffbe7f2ffcda + md5: 9efaddf61a69aeb93cff572fed6baccc depends: - __osx >=11.0 - - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - azure-identity-cpp >=1.13.3,<1.13.4.0a0 @@ -9309,18 +9442,20 @@ packages: - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - arrow-cpp <0.0a0 - - apache-arrow-proc =*=cpu - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 4267842 - timestamp: 1776815214765 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda - sha256: 40391ae880c7bb101b0774fbaba62410dec5984d9f3527fe40798114c3de37a5 - md5: b5a964c5cafa1663a84bec0cccbd03db + size: 4239511 + timestamp: 1778174861358 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-h37f918f_1_cpu.conda + build_number: 1 + sha256: 35b64339ff3f2c8cfe19424dafbd23071c48ddf76dbab1ee2fb52f76437f9333 + md5: db9503de7e87d1e986a2ca1b1f7179b1 depends: - - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 - azure-core-cpp >=1.16.2,<1.16.3.0a0 - azure-identity-cpp >=1.13.3,<1.13.4.0a0 @@ -9332,7 +9467,7 @@ packages: - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl >=8.19.0,<9.0a0 + - libcurl >=8.20.0,<9.0a0 - libgoogle-cloud >=3.3.0,<3.4.0a0 - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 - libprotobuf >=6.33.5,<6.33.6.0a0 @@ -9349,74 +9484,84 @@ packages: - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 4339700 - timestamp: 1776819462924 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda - sha256: a46a6264bea99b9980dfd469922a43a6ad8ed579b5d58c5236811b2893082ba7 - md5: 178d7e3f5c392e606ccd0aaff4331019 + size: 4294275 + timestamp: 1778179333251 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + build_number: 1 + sha256: d5e2ca1557393490eb0b921d0dabe6203c685da97c0cf8c5b15c21c2d69b517a + md5: fa76d2ed4b435617a0fe5b8e7b9ae9c1 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 24.0.0 ha7f89c6_0_cpu - - libarrow-compute 24.0.0 h53684a4_0_cpu + - libarrow 24.0.0 h0935d00_1_cpu + - libarrow-compute 24.0.0 h53684a4_1_cpu - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 + license_family: APACHE purls: [] - size: 592885 - timestamp: 1776816000408 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_0_cpu.conda - sha256: 5a84b718bab4f4a494731a29ccc888f5d6f65b5fe9c6f720c0f1931c4af7c431 - md5: 330879d2d6e847716d7dcaa748a915fb + size: 591773 + timestamp: 1778175876713 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + build_number: 1 + sha256: 4d0f25e14c02a08a9843bf7cb9af8fe00772151ac95a93809482aa7e1002c0ea + md5: 4c849c657fd2f7676c6935a17d9a6c04 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 h2124f06_0_cpu - - libarrow-compute 24.0.0 h3b6a98a_0_cpu + - libarrow 24.0.0 h37fbca7_1_cpu + - libarrow-compute 24.0.0 h3b6a98a_1_cpu - libcxx >=21 - libopentelemetry-cpp >=1.26.0,<1.27.0a0 - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 520298 - timestamp: 1776815770472 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda - sha256: e07761db31c034dd1e80007d59e22859615ef4a263f2bf987f38aabbea77a17c - md5: 15b51e64c379f24f69dd93cace3525e8 + size: 519410 + timestamp: 1778175198375 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_1_cpu.conda + build_number: 1 + sha256: f0651a93459453ad646db770a5739517e3da31d5ceff6fb6f9adc20da9e3e15d + md5: bf58b68d1923ed120e181a2b3529c638 depends: - - libarrow 24.0.0 hc74aee5_0_cpu - - libarrow-compute 24.0.0 h081cd8e_0_cpu + - libarrow 24.0.0 h37f918f_1_cpu + - libarrow-compute 24.0.0 h081cd8e_1_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 + license_family: APACHE purls: [] - size: 447020 - timestamp: 1776819781866 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda - sha256: 24886c26b36267d706be56c06bd89b1692e3da0e3099bdc6bd5cecd042cca606 - md5: 73e0aeaa603ff40128e75435a3c5ac77 + size: 447154 + timestamp: 1778179585769 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + build_number: 1 + sha256: e4ca855698a8005508114a8c197ae7fe48ea37430064253a2055dbb0122f8a39 + md5: 0aac1926c3b2f8c35570af6be677f8ad depends: - __glibc >=2.17,<3.0.a0 - - libarrow 24.0.0 ha7f89c6_0_cpu + - libarrow 24.0.0 h0935d00_1_cpu - libgcc >=14 - libre2-11 >=2025.11.5 - libstdcxx >=14 - libutf8proc >=2.11.3,<2.12.0a0 - re2 license: Apache-2.0 + license_family: APACHE purls: [] - size: 2992194 - timestamp: 1776815851047 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_0_cpu.conda - sha256: 47062ecfaa022f038623a25e69d3ced60aafbd46c4997ae718cb1e3aa478311f - md5: beced1053d628ad812ddcc975fa8a929 + size: 2992759 + timestamp: 1778175759450 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + build_number: 1 + sha256: 04076544c1797753b4ba145a68727bf68827591de9870867bac5e4e7ca39a829 + md5: 548f34b1374e772de97cdba8774c5f58 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 h2124f06_0_cpu + - libarrow 24.0.0 h37fbca7_1_cpu - libcxx >=21 - libopentelemetry-cpp >=1.26.0,<1.27.0a0 - libprotobuf >=6.33.5,<6.33.6.0a0 @@ -9424,14 +9569,16 @@ packages: - libutf8proc >=2.11.3,<2.12.0a0 - re2 license: Apache-2.0 + license_family: APACHE purls: [] - size: 2241493 - timestamp: 1776815413056 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda - sha256: 93171fdab7cf3c8b52ef1d3b897713bb8b820130bd3a8250c9bd5e4e3ecf70bb - md5: bd6eafa1d7f8b0cc288f007cf8de0555 + size: 2243159 + timestamp: 1778174967068 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_1_cpu.conda + build_number: 1 + sha256: 5d6821e62bd747f660ec9814d72aa6b47096e50f5f45334dba0eee037cd41695 + md5: 783540ebc553149b52eee6a5a363fd07 depends: - - libarrow 24.0.0 hc74aee5_0_cpu + - libarrow 24.0.0 h37f918f_1_cpu - libre2-11 >=2025.11.5 - libutf8proc >=2.11.3,<2.12.0a0 - re2 @@ -9439,159 +9586,172 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 + license_family: APACHE purls: [] - size: 1753471 - timestamp: 1776819564791 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda - sha256: 37293ee47f819072805e7e23d3ed15e7f1baccfacb2080ed360a96e208d930b2 - md5: dc226b80ae51753ce2bd8193dcc42a88 + size: 1757536 + timestamp: 1778179415666 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + build_number: 1 + sha256: 38ce55721b4d2cc776d0e34078ccba63dfd5c141f1f49bb41cd6ae4da10c21e4 + md5: 021214e64486a6ba4df95d64b703f1fb depends: - __glibc >=2.17,<3.0.a0 - - libarrow 24.0.0 ha7f89c6_0_cpu - - libarrow-acero 24.0.0 h635bf11_0_cpu - - libarrow-compute 24.0.0 h53684a4_0_cpu + - libarrow 24.0.0 h0935d00_1_cpu + - libarrow-acero 24.0.0 h635bf11_1_cpu + - libarrow-compute 24.0.0 h53684a4_1_cpu - libgcc >=14 - - libparquet 24.0.0 h7376487_0_cpu + - libparquet 24.0.0 h7376487_1_cpu - libstdcxx >=14 license: Apache-2.0 + license_family: APACHE purls: [] - size: 591654 - timestamp: 1776816104463 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_0_cpu.conda - sha256: 228d9d7c05e0c9c9d94f192649d8345dbea77680f6674d0db25f22645e7f0d77 - md5: f75c7393899ad279c62c94089aacf760 + size: 591861 + timestamp: 1778175957189 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + build_number: 1 + sha256: 2557536377f7e3ae986e47b3584b53ca148d91f6d1b836f3371ff56b15082379 + md5: bfcfc8dc98740cd7577cc25933ce6a62 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 h2124f06_0_cpu - - libarrow-acero 24.0.0 hee8fe31_0_cpu - - libarrow-compute 24.0.0 h3b6a98a_0_cpu + - libarrow 24.0.0 h37fbca7_1_cpu + - libarrow-acero 24.0.0 hee8fe31_1_cpu + - libarrow-compute 24.0.0 h3b6a98a_1_cpu - libcxx >=21 - libopentelemetry-cpp >=1.26.0,<1.27.0a0 - - libparquet 24.0.0 h16c0493_0_cpu + - libparquet 24.0.0 h16c0493_1_cpu - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 520380 - timestamp: 1776816021240 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda - sha256: 40ca580f478140a9d2a73e0d7307ce2b9e8666b5131bd053ded411cd6b575aea - md5: 72c2b0d37627da3386a0e7446b79008f + size: 519773 + timestamp: 1778175399688 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_1_cpu.conda + build_number: 1 + sha256: c2556c2695ab5f38a8d0732a5f70b72611305aea175553efcb0563a58a913b6d + md5: 85086a57de14a61242ee23f6527c1a71 depends: - - libarrow 24.0.0 hc74aee5_0_cpu - - libarrow-acero 24.0.0 h7d8d6a5_0_cpu - - libarrow-compute 24.0.0 h081cd8e_0_cpu - - libparquet 24.0.0 h7051d1f_0_cpu + - libarrow 24.0.0 h37f918f_1_cpu + - libarrow-acero 24.0.0 h7d8d6a5_1_cpu + - libarrow-compute 24.0.0 h081cd8e_1_cpu + - libparquet 24.0.0 h7051d1f_1_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 + license_family: APACHE purls: [] - size: 428602 - timestamp: 1776819923347 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda - sha256: ea628348819cbccf73b0440071c437e33db05e01fd9c7d4f6a0268c0217c12fc - md5: cb5a9557a2ffa1b18b4e05621354c6bd + size: 429162 + timestamp: 1778179693804 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + build_number: 1 + sha256: 9479a863e61e5cc3e3ef395267f23dc1475199f53a96c0d04a168f4b0c97db2a + md5: e3e42803a838c2177759e6aef1363512 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 ha7f89c6_0_cpu - - libarrow-acero 24.0.0 h635bf11_0_cpu - - libarrow-dataset 24.0.0 h635bf11_0_cpu + - libarrow 24.0.0 h0935d00_1_cpu + - libarrow-acero 24.0.0 h635bf11_1_cpu + - libarrow-dataset 24.0.0 h635bf11_1_cpu - libgcc >=14 - libprotobuf >=6.33.5,<6.33.6.0a0 - libstdcxx >=14 license: Apache-2.0 + license_family: APACHE purls: [] - size: 502184 - timestamp: 1776816139283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_0_cpu.conda - sha256: a25d817ddb317ac5c2bb352f48c5f38a5de2a9b4e148047641de3e285280337b - md5: 7e1ca98358e41e10f187a8b125523525 + size: 501879 + timestamp: 1778175984173 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + build_number: 1 + sha256: 9ba4cd38cfb7d2830b0e6905a2bfa6dd6c435d81ec3f923dc664b45b91cc742b + md5: e9d4414f2487505ea94cbb0852aa0c51 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 h2124f06_0_cpu - - libarrow-acero 24.0.0 hee8fe31_0_cpu - - libarrow-dataset 24.0.0 hee8fe31_0_cpu + - libarrow 24.0.0 h37fbca7_1_cpu + - libarrow-acero 24.0.0 hee8fe31_1_cpu + - libarrow-dataset 24.0.0 hee8fe31_1_cpu - libcxx >=21 - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 454733 - timestamp: 1776816138758 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda - sha256: 569f9e5853bdf3cd1660d121595662e4852e6b157f02b73a3057ac6fe2208000 - md5: 913460f9f04cc084d326473c52f4df2d + size: 455365 + timestamp: 1778175475107 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_1_cpu.conda + build_number: 1 + sha256: e5a7a0d8ea0735a96f0927343d668258db64934ae0eb321078f751803cf660ed + md5: e4baea828629bbc187e06305f76ca938 depends: - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 hc74aee5_0_cpu - - libarrow-acero 24.0.0 h7d8d6a5_0_cpu - - libarrow-dataset 24.0.0 h7d8d6a5_0_cpu + - libarrow 24.0.0 h37f918f_1_cpu + - libarrow-acero 24.0.0 h7d8d6a5_1_cpu + - libarrow-dataset 24.0.0 h7d8d6a5_1_cpu - libprotobuf >=6.33.5,<6.33.6.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 + license_family: APACHE purls: [] - size: 362008 - timestamp: 1776819969211 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - build_number: 6 - sha256: 7bfe936dbb5db04820cf300a9cc1f5ee8d5302fc896c2d66e30f1ee2f20fbfd6 - md5: 6d6d225559bfa6e2f3c90ee9c03d4e2e + size: 362015 + timestamp: 1778179727388 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda + build_number: 7 + sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 + md5: 955b44e8b00b7f7ef4ce0130cef12394 depends: - - libopenblas >=0.3.32,<0.3.33.0a0 - - libopenblas >=0.3.32,<1.0a0 + - libopenblas >=0.3.33,<0.3.34.0a0 + - libopenblas >=0.3.33,<1.0a0 constrains: - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas - - mkl <2026 + - libcblas 3.11.0 7*_openblas + - blas 2.307 openblas + - liblapack 3.11.0 7*_openblas + - liblapacke 3.11.0 7*_openblas + - mkl <2027 license: BSD-3-Clause license_family: BSD purls: [] - size: 18621 - timestamp: 1774503034895 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda - build_number: 6 - sha256: 979227fc03628925037ab2dfda008eb7b5592644d9c2c21dd285cefe8c42553d - md5: e551103471911260488a02155cef9c94 + size: 18716 + timestamp: 1778489854108 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda + build_number: 7 + sha256: 662935bfb93d2d097e26e273a3a2f504a9f833f64aa6f9e295b577655478c39b + md5: ab6670d099d19fe70cb9efb88a1b5f78 depends: - - libopenblas >=0.3.32,<0.3.33.0a0 - - libopenblas >=0.3.32,<1.0a0 + - libopenblas >=0.3.33,<0.3.34.0a0 + - libopenblas >=0.3.33,<1.0a0 constrains: - - liblapacke 3.11.0 6*_openblas - - liblapack 3.11.0 6*_openblas - - blas 2.306 openblas - - libcblas 3.11.0 6*_openblas - - mkl <2026 + - libcblas 3.11.0 7*_openblas + - blas 2.307 openblas + - mkl <2027 + - liblapack 3.11.0 7*_openblas + - liblapacke 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18859 - timestamp: 1774504387211 -- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda - build_number: 6 - sha256: 10c8054f007adca8c780cd8bb9335fa5d990f0494b825158d3157983a25b1ea2 - md5: 95543eec964b4a4a7ca3c4c9be481aa1 + size: 18783 + timestamp: 1778489983152 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h8455456_mkl.conda + build_number: 7 + sha256: 9eec27eee4300284e62a61cb2298089c80d31f6f9e924eeabc06e9788a00cffe + md5: 269e54b44974ff48846b4c31d0397041 depends: - - mkl >=2025.3.1,<2026.0a0 + - mkl >=2026.0.0,<2027.0a0 constrains: - - blas 2.306 mkl - - liblapacke 3.11.0 6*_mkl - - liblapack 3.11.0 6*_mkl - - libcblas 3.11.0 6*_mkl + - blas 2.307 mkl + - libcblas 3.11.0 7*_mkl + - liblapacke 3.11.0 7*_mkl + - liblapack 3.11.0 7*_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 68082 - timestamp: 1774503684284 + size: 68060 + timestamp: 1778490352569 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e md5: 72c8fd1af66bd67bf580645b426513ed @@ -9697,67 +9857,67 @@ packages: purls: [] size: 252903 timestamp: 1764017901735 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - build_number: 6 - sha256: 57edafa7796f6fa3ebbd5367692dd4c7f552be42109c2dd1a7c89b55089bf374 - md5: 36ae340a916635b97ac8a0655ace2a35 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda + build_number: 7 + sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 + md5: 0675639dc24cb0032f199e7ff68e4633 depends: - - libblas 3.11.0 6_h4a7cf45_openblas + - libblas 3.11.0 7_h4a7cf45_openblas constrains: - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas - - liblapacke 3.11.0 6*_openblas + - liblapacke 3.11.0 7*_openblas + - blas 2.307 openblas + - liblapack 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18622 - timestamp: 1774503050205 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda - build_number: 6 - sha256: 2e6b3e9b1ab672133b70fc6730e42290e952793f132cb5e72eee22835463eba0 - md5: 805c6d31c5621fd75e53dfcf21fb243a + size: 18675 + timestamp: 1778489861559 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda + build_number: 7 + sha256: 3ac3d27022b3ca8b1980c087e0ede250434f6ed90a4fdc78a8a5ed382bc75505 + md5: 189b373453ec3904095dcb16f502bace depends: - - libblas 3.11.0 6_h51639a9_openblas + - libblas 3.11.0 7_h51639a9_openblas constrains: - - liblapacke 3.11.0 6*_openblas - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas + - blas 2.307 openblas + - liblapack 3.11.0 7*_openblas + - liblapacke 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18863 - timestamp: 1774504433388 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda - build_number: 6 - sha256: 02b2a2225f4899c6aaa1dc723e06b3f7a4903d2129988f91fc1527409b07b0a5 - md5: 9e4bf521c07f4d423cba9296b7927e3c + size: 18810 + timestamp: 1778489991330 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_h2a3cdd5_mkl.conda + build_number: 7 + sha256: 82da0f854831f783f9d3f1219c4255956e8167a474f3f526151128f02453871c + md5: 4700b7af6acefb26ff0127ba68230941 depends: - - libblas 3.11.0 6_hf2e6a31_mkl + - libblas 3.11.0 7_h8455456_mkl constrains: - - blas 2.306 mkl - - liblapacke 3.11.0 6*_mkl - - liblapack 3.11.0 6*_mkl + - blas 2.307 mkl + - liblapacke 3.11.0 7*_mkl + - liblapack 3.11.0 7*_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 68221 - timestamp: 1774503722413 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.4-default_h746c552_0.conda - sha256: 05830902772b73bb9f0806eb45d43e0c4250452e028069234632db60d7e84793 - md5: 1a39f14c89cf0a54aee5ef6f679f1030 + size: 68594 + timestamp: 1778490364980 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + sha256: 7f479f796ba05f22324fb484f53da6f9948395499d7558cc4ff5ec24e91448b1 + md5: af8c5fb71cb5aa4861365af2784fc9ce depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm22 >=22.1.4,<22.2.0a0 + - libllvm22 >=22.1.5,<22.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 12815684 - timestamp: 1776922765965 -- conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.4-default_ha2db4b5_0.conda - sha256: 24c916b71547377cd1c4fe949a8dd823be22a2e1a0698e56bd95a6fb7df5aaf4 - md5: 8759fc24d708cc4af95af5d86f5441d1 + size: 12827971 + timestamp: 1778479852868 +- conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.5-default_ha2db4b5_0.conda + sha256: c10dcb835068ced8d0d45dfeb7126f5ff686258c0fbf2cd8ea6de5b629d0c52a + md5: 74229a56cbbfda28f75bed42ac5cacc7 depends: - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 @@ -9767,8 +9927,8 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 30484843 - timestamp: 1776921661165 + size: 30485424 + timestamp: 1778465527873 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 md5: c965a5aa0d5c1c37ffc62dff36e28400 @@ -9815,64 +9975,64 @@ packages: purls: [] size: 4518030 timestamp: 1770902209173 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 - md5: d50608c443a30c341c24277d28290f76 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + sha256: 75963a5dd913311f59a35dbd307592f4fa754c4808aff9c33edb430c415e38eb + md5: c3cc2864f82a944bc90a7beb4d3b0e88 depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - - libnghttp2 >=1.67.0,<2.0a0 + - libnghttp2 >=1.68.1,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 466704 - timestamp: 1773218522665 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - sha256: c4d581b067fa60f9dc0e1c5f18b756760ff094a03139e6b206eb98d185ae2bb1 - md5: 9fc7771fc8104abed9119113160be15a + size: 468706 + timestamp: 1777461492876 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + sha256: 38c0bc634b61e542776e97cfd15d5d41edd304d4e47c333004d2d622439b2381 + md5: 2f57b7d0c6adda88957586b7afd78438 depends: - __osx >=11.0 - krb5 >=1.22.2,<1.23.0a0 - - libnghttp2 >=1.67.0,<2.0a0 + - libnghttp2 >=1.68.1,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 399616 - timestamp: 1773219210246 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda - sha256: 6b2143ba5454b399dab4471e9e1d07352a2f33b569975e6b8aedc2d9bf51cbb0 - md5: ed181e29a7ebf0f60b84b98d6140a340 + size: 400568 + timestamp: 1777462251987 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.20.0-h8206538_0.conda + sha256: f4ce5aa835a698532feaa368e804365a7e45a9edebe006a8e1c80505d893c24e + md5: 7bee27a8f0a295117ccb864f30d2d87e depends: - krb5 >=1.22.2,<1.23.0a0 - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: curl license_family: MIT purls: [] - size: 392543 - timestamp: 1773218585056 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda - sha256: 25a0d02148a39b665d9c2957676faf62a4d2a58494d53b201151199a197db4b0 - md5: 448a1af83a9205655ee1cf48d3875ca3 + size: 393114 + timestamp: 1777461635732 +- 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 purls: [] - size: 569927 - timestamp: 1776816293111 + size: 569359 + timestamp: 1778191546305 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 @@ -9906,18 +10066,18 @@ packages: purls: [] size: 156818 timestamp: 1761979842440 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 - md5: 9314bc5a1fe7d1044dc9dfd3ef400535 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.127-hb03c661_0.conda + sha256: 7d3187c11b7ae66c5595a8afd5a7ce352a490527fdf6614cab129bc7f2c16ba3 + md5: d8d16b9b32a3c5df7e5b3350e2cbe058 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libpciaccess >=0.18,<0.19.0a0 + - libpciaccess >=0.19,<0.20.0a0 license: MIT license_family: MIT purls: [] - size: 310785 - timestamp: 1757212153962 + size: 311505 + timestamp: 1778975798004 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 md5: c277e0a4d549b03ac1e9d6cbbe3d017b @@ -10017,45 +10177,45 @@ packages: purls: [] size: 410555 timestamp: 1685726568668 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c - md5: 49f570f3bc4c874a06ea69b7225753af +- 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.7.5.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 76624 - timestamp: 1774719175983 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - sha256: 06780dec91dd25770c8cf01e158e1062fbf7c576b1406427475ce69a8af75b7e - md5: a32123f93e168eaa4080d87b0fb5da8a + size: 77241 + timestamp: 1777846112704 +- 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.5.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 68192 - timestamp: 1774719211725 -- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda - sha256: 6850c3a4d5dc215b86f58518cfb8752998533d6569b08da8df1da72e7c68e571 - md5: bfb43f52f13b7c56e7677aa7a8efdf0c + size: 68789 + timestamp: 1777846180142 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + sha256: 2d81d647c1f01108803457cac999b947456f44dd0a3c2325395677feacaeca67 + md5: 264e350e035092b5135a2147c238aec4 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - expat 2.7.5.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 70609 - timestamp: 1774719377850 + size: 71094 + timestamp: 1777846223617 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -10158,105 +10318,105 @@ packages: purls: [] size: 340180 timestamp: 1774300467879 -- 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-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=*_18 - - libgomp 15.2.0 he0feb66_18 + - 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 purls: [] - size: 1041788 - timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e - md5: 92df6107310b1fff92c4cc84f0de247b + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + sha256: 06644fa4d34d57c9e48f4d84b1256f9e5f654fdb37f43acc8a58a396952d42b7 + md5: 644058123986582db33aebd4ae2ca184 depends: - _openmp_mutex constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 18 + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 401974 - timestamp: 1771378877463 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda - sha256: da2c96563c76b8c601746f03e03ac75d2b4640fa2ee017cb23d6c9fc31f1b2c6 - md5: b085746891cca3bd2704a450a7b4b5ce + size: 404080 + timestamp: 1778273064154 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + sha256: 80e80ef5e31b00b12539db3c5aaecde60dab91381abfc1060e323d5c3b016dce + md5: cc5d690fc1c629038f13c68e88e65f44 depends: - _openmp_mutex >=4.5 - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: - - libgcc-ng ==15.2.0=*_18 - msys2-conda-epoch <0.0a0 - - libgomp 15.2.0 h8ee18e1_18 + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 h8ee18e1_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 820022 - timestamp: 1771382190160 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - sha256: 1abc6a81ee66e8ac9ac09a26e2d6ad7bba23f0a0cc3a6118654f036f9c0e1854 - md5: 06901733131833f5edd68cf3d9679798 + size: 821854 + timestamp: 1778273037795 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + sha256: e1815bb11d5abe886979e95889d84310d83d078d36a3567ca67cbf57a3876d88 + md5: 7d517e32d656a8880d98c0e4fc8ddc2c depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 3084533 - timestamp: 1771377786730 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - sha256: af69fc5852908d26e5b630b270982ac792506551dd6af1614bf0370dd5ab5746 - md5: 5d3a96d55f1be45fef88ee23155effd9 + size: 3091520 + timestamp: 1778268364856 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + sha256: 38a557eba305468ac1f90ac85e50d8defd76141cb0b8a43b2fc1aca71dd5d5f2 + md5: 683fcb168e1df9a21fa80d5aa2d9330b depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 3085932 - timestamp: 1771378098166 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 - md5: d5e96b1ed75ca01906b3d2469b4ce493 + size: 3095909 + timestamp: 1778268932148 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: 331ee9b72b9dff570d56b1302c5ab37d depends: - - libgcc 15.2.0 he0feb66_18 + - libgcc 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27526 - timestamp: 1771378224552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee - md5: 9063115da5bc35fdc3e1002e69b9ef6e + size: 27694 + timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f + md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 depends: - - libgfortran5 15.2.0 h68bc16d_18 + - libgfortran5 15.2.0 h68bc16d_19 constrains: - - libgfortran-ng ==15.2.0=*_18 + - libgfortran-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27523 - timestamp: 1771378269450 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836 - md5: 26981599908ed2205366e8fc91b37fc6 + size: 27655 + timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + sha256: d4837b3b9b30af3132d260225e91ab9dde83be04c59513f500cc81050fb37486 + md5: 1ea03f87cdb1078fbc0e2b2deb63752c depends: - - libgfortran5 15.2.0 hdae7583_18 + - libgfortran5 15.2.0 hdae7583_19 constrains: - - libgfortran-ng ==15.2.0=*_18 + - libgfortran-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 138973 - timestamp: 1771379054939 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 - md5: 646855f357199a12f02a87382d429b75 + size: 139675 + timestamp: 1778273280875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 + md5: 85072b0ad177c966294f129b7c04a2d5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -10265,11 +10425,11 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 2482475 - timestamp: 1771378241063 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e - md5: c4a6f7989cffb0544bfd9207b6789971 + size: 2483673 + timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + sha256: d0a68b7a121d115b80c169e24d1265dcc25a3fe58d107df1bbc430797e226d88 + md5: ba36d8c606a6a53fe0b8c12d47267b3d depends: - libgcc >=15.2.0 constrains: @@ -10277,8 +10437,8 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 598634 - timestamp: 1771378886363 + size: 599691 + timestamp: 1778273075448 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d md5: 928b8be80851f5d8ffb016f9c81dae7a @@ -10301,40 +10461,40 @@ packages: purls: [] size: 113911 timestamp: 1731331012126 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce - md5: bb26456332b07f68bf3b7622ed71c0da +- 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 - - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libffi >=3.5.2,<3.6.0a0 - pcre2 >=10.47,<10.48.0a0 + - libzlib >=1.3.2,<2.0a0 + - libiconv >=1.18,<2.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4398701 - timestamp: 1771863239578 -- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - sha256: f035fb25f8858f201e0055c719ef91022e9465cd51fe803304b781863286fb10 - md5: 0329a7e92c8c8b61fcaaf7ad44642a96 + size: 4754097 + timestamp: 1778508800134 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda + sha256: f61277e224e9889c221bb2eac0f57d5aeeb82fc45d3dc326957d251c97444f7c + md5: 5fb838786a8317ebb38056bbe236d3ff depends: - - libffi >=3.5.2,<3.6.0a0 - - libiconv >=1.18,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 - - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libintl >=0.22.5,<1.0a0 + - libffi >=3.5.2,<3.6.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4095369 - timestamp: 1771863229701 + size: 4522891 + timestamp: 1778508851933 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 md5: 434ca7e50e40f4918ab701e3facd59a0 @@ -10367,19 +10527,19 @@ packages: purls: [] size: 26388 timestamp: 1731331003255 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 - md5: 239c5e9546c38a1e884d69effcf4c882 +- 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 purls: [] - size: 603262 - timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda - sha256: 94981bc2e42374c737750895c6fdcfc43b7126c4fc788cad0ecc7281745931da - md5: 939fb173e2a4d4e980ef689e99b35223 + size: 603817 + timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda + sha256: 4dc958ced2fc7f42bc675b07e2c9abe3e150875ffdf62ca551d94fc6facf1fd7 + md5: f1147651e3fdd585e2f442c0c2fc8f2d depends: - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: @@ -10387,8 +10547,8 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 663864 - timestamp: 1771382118742 + size: 664640 + timestamp: 1778272979661 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda sha256: 17ea802cef3942b0a850b8e33b03fc575f79734f3c829cdd6a4e56e2dae60791 md5: b2baa4ce6a9d9472aaa602b88f8d40ac @@ -10567,9 +10727,9 @@ packages: purls: [] size: 11546515 timestamp: 1774013326223 -- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 - md5: 3b576f6860f838f950c570f4433b086e +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda + sha256: 2ee12e37223dfcd0acd050c80a91150c482b6e2899198521e1800dce66662467 + md5: 6a01c986e30292c715038d2788aa1385 depends: - libwinpthread >=12.0.0.r4.gg4f2fc60ca - libxml2 @@ -10580,8 +10740,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 2411241 - timestamp: 1765104337762 + size: 2396128 + timestamp: 1770954127918 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -10657,54 +10817,54 @@ packages: purls: [] size: 842806 timestamp: 1775962811457 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - build_number: 6 - sha256: 371f517eb7010b21c6cc882c7606daccebb943307cb9a3bf2c70456a5c024f7d - md5: 881d801569b201c2e753f03c84b85e15 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda + build_number: 7 + sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 + md5: 6569b4f273740e25dc0dc7e3232c2a6c depends: - - libblas 3.11.0 6_h4a7cf45_openblas + - libblas 3.11.0 7_h4a7cf45_openblas constrains: - - blas 2.306 openblas - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas + - liblapacke 3.11.0 7*_openblas + - libcblas 3.11.0 7*_openblas + - blas 2.307 openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18624 - timestamp: 1774503065378 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - build_number: 6 - sha256: 21606b7346810559e259807497b86f438950cf19e71838e44ebaf4bd2b35b549 - md5: ee33d2d05a7c5ea1f67653b37eb74db1 + size: 18694 + timestamp: 1778489869038 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.conda + build_number: 7 + sha256: ff3018918ca8b22173dcb231842e819767fd05a08df61483eb5f3e9f2895d114 + md5: d1289ad41d5a78e2269eea3a2d7f0c7d depends: - - libblas 3.11.0 6_h51639a9_openblas + - libblas 3.11.0 7_h51639a9_openblas constrains: - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas - - blas 2.306 openblas + - libcblas 3.11.0 7*_openblas + - blas 2.307 openblas + - liblapacke 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18863 - timestamp: 1774504467905 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - build_number: 6 - sha256: 2e6ac39e456ba13ec8f02fc0787b8a22c89780e24bd5556eaf642177463ffb36 - md5: 7e9cdaf6f302142bc363bbab3b5e7074 + size: 18780 + timestamp: 1778490000843 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_hf9ab0e9_mkl.conda + build_number: 7 + sha256: cd20e15b893ef82612fa46db41ad677351feb0c42cf3c27172777a35bb99b421 + md5: 56de899eaa1209fd8769418b7bc7a60c depends: - - libblas 3.11.0 6_hf2e6a31_mkl + - libblas 3.11.0 7_h8455456_mkl constrains: - - blas 2.306 mkl - - liblapacke 3.11.0 6*_mkl - - libcblas 3.11.0 6*_mkl + - blas 2.307 mkl + - libcblas 3.11.0 7*_mkl + - liblapacke 3.11.0 7*_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 80571 - timestamp: 1774503757128 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.4-hf7376ad_0.conda - sha256: 6cf83bb8084b4b305fd2d6da9e3ab42acc0a01b19d11c4d7e9766dad91afce49 - md5: 80a690c83cba58ba483b90a07e59e721 + size: 80578 + timestamp: 1778490377191 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.5-hf7376ad_1.conda + sha256: 094198dc5c7fbd85e3719d192d5b77c3f0dccf657dfd9ba0c79e391f11f7ace2 + md5: 6adc0202fa7fcf0a5fce8c31ef2ed866 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -10716,8 +10876,8 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 44242661 - timestamp: 1776821554393 + size: 44241856 + timestamp: 1778417624650 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d md5: b88d90cad08e6bc8ad540cb310a761fb @@ -10868,36 +11028,36 @@ packages: purls: [] size: 15164138 timestamp: 1776121337288 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - sha256: 6dc30b28f32737a1c52dada10c8f3a41bc9e021854215efca04a7f00487d09d9 - md5: 89d61bc91d3f39fda0ca10fcd3c68594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda + sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 + md5: 2d3278b721e40468295ca755c3b84070 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.32,<0.3.33.0a0 + - openblas >=0.3.33,<0.3.34.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 5928890 - timestamp: 1774471724897 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - sha256: 713e453bde3531c22a660577e59bf91ef578dcdfd5edb1253a399fa23514949a - md5: 3a1111a4b6626abebe8b978bb5a323bf + size: 5931919 + timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda + sha256: 9dd455b2d172aeedfa2058d324b5b5822b0bc1b7c1f32cd183d7078540d2f6eb + md5: 909e41855c29f0d52ae630198cd57135 depends: - __osx >=11.0 - libgfortran - libgfortran5 >=14.3.0 - llvm-openmp >=19.1.7 constrains: - - openblas >=0.3.32,<0.3.33.0a0 + - openblas >=0.3.33,<0.3.34.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 4308797 - timestamp: 1774472508546 + size: 4304965 + timestamp: 1776995497368 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead md5: 7df50d44d4a14d6c31a2c54f2cd92157 @@ -10992,62 +11152,68 @@ packages: purls: [] size: 436562 timestamp: 1774001693139 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda - sha256: 374a9c6222df047ab6d43c6efe96d380b7750b53ec9b84fc9ad8bf1c22df4522 - md5: c828cca50cd3a7c53d12ce8f0872c6ec +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda + build_number: 1 + sha256: 65d6ba055d872911d30f55b8bf2880ff05f57f2a9cc59447be1dccce07f68109 + md5: 5e60f3c311d00d456f089177bb75ebaf depends: - __glibc >=2.17,<3.0.a0 - - libarrow 24.0.0 ha7f89c6_0_cpu + - libarrow 24.0.0 h0935d00_1_cpu - libgcc >=14 - libstdcxx >=14 - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.6,<4.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 1428303 - timestamp: 1776815964191 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_0_cpu.conda - sha256: 992e7c26f555689ea9df19c534df691df148e96f5e4f0c1e5c71be8ea7b8b58c - md5: 09b65c6b00e5c9d9f4ca07427b492daf + size: 1426881 + timestamp: 1778175848424 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda + build_number: 1 + sha256: 72e5dc5747144cc4e8ea4c287509c69c6f8d1c72a678285e39e3df76867cef5b + md5: 5b32ce08a542383f4c72cdee323979e8 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - - libarrow 24.0.0 h2124f06_0_cpu + - libarrow 24.0.0 h37fbca7_1_cpu - libcxx >=21 - libopentelemetry-cpp >=1.26.0,<1.27.0a0 - libprotobuf >=6.33.5,<6.33.6.0a0 - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.6,<4.0a0 license: Apache-2.0 + license_family: APACHE purls: [] - size: 1097756 - timestamp: 1776815688915 -- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda - sha256: 12eca40be87388d28afbcf78c9897cd2a762a64122b2bbc0e8016acb447c8252 - md5: 0b34d3ccc580180446b7f7225ddab6ab + size: 1098422 + timestamp: 1778175143698 +- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_1_cpu.conda + build_number: 1 + sha256: b2afe937c690bfac4481340f4834ad7d00693e3f3f987bf0c3ad36e8412a7462 + md5: 7046be3427cdf836adef97415d55d37f depends: - - libarrow 24.0.0 hc74aee5_0_cpu + - libarrow 24.0.0 h37f918f_1_cpu - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.6,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 + license_family: APACHE purls: [] - size: 966867 - timestamp: 1776819731491 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 - md5: 70e3400cbbfa03e96dcde7fc13e38c7b + size: 965302 + timestamp: 1778179550580 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda + sha256: f41721636a7c2e51bc2c642e1127955ab9c81145470714fdaac44d4d09e4af41 + md5: 33082e13b4769b48cfeb648e15bfe3fc depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 28424 - timestamp: 1749901812541 + size: 29147 + timestamp: 1773533027610 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 md5: eba48a68a1a2b9d3c0d9511548db85db @@ -11081,20 +11247,20 @@ packages: purls: [] size: 385227 timestamp: 1776315248638 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda - sha256: c7e61b86c273ec1ce92c0e087d1a0f3ed3b9485507c6cd35e03bc63de1b6b03f - md5: 405ec206d230d9d37ad7c2636114cbf4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.4-hd5a49e9_0.conda + sha256: 076742d4a9fa88711c5fc6726b967e6a03b5060e669aa03288c684a7ae03583b + md5: 2772b7ab7bc43f24e9585a714761a255 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - - openldap >=2.6.10,<2.7.0a0 - - openssl >=3.5.5,<4.0a0 + - openldap >=2.6.13,<2.7.0a0 + - openssl >=3.5.6,<4.0a0 license: PostgreSQL purls: [] - size: 2865686 - timestamp: 1772136328077 + size: 2754709 + timestamp: 1778786234149 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda sha256: afbf195443269ae10a940372c1d37cda749355d2bd96ef9587a962abd87f2429 md5: 11ac478fa72cf12c214199b8a96523f4 @@ -11186,9 +11352,9 @@ packages: purls: [] size: 266062 timestamp: 1768190189553 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - sha256: e03ed186eefb46d7800224ad34bad1268c9d19ecb8f621380a50601c6221a4a7 - md5: ad3a0e2dc4cce549b2860e2ef0e6d75b +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_19.conda + sha256: 8766de5423b0a510e2b1bdd1963d0554bdad2119f3e31d8fbd4189af434235ca + md5: 007796e5a595bbc7df4a5e1580d72e1a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14.3.0 @@ -11196,11 +11362,11 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 7949259 - timestamp: 1771377982207 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda - sha256: 0329e23d54a567c259adc962a62172eaa55e6ca33c105ef67b4f3cdb4ef70eaa - md5: ff754fbe790d4e70cf38aea3668c3cb3 + size: 7947790 + timestamp: 1778268494844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + sha256: 7a58892a52739ce4c0f7109de9e91b4353104748eb04fc6441d88e8af444ba99 + md5: 67eef12ce33f7ff99900c212d7076fc2 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -11208,8 +11374,8 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 8095113 - timestamp: 1771378289674 + size: 7930689 + timestamp: 1778269054623 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 md5: 7af961ef4aa2c1136e11dd43ded245ab @@ -11240,39 +11406,38 @@ packages: purls: [] size: 276860 timestamp: 1772479407566 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - sha256: ec37c79f737933bbac965f5dc0f08ef2790247129a84bb3114fad4900adce401 - md5: 810d83373448da85c3f673fbcb7ad3a3 +- 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 - - icu >=78.3,<79.0a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 958864 - timestamp: 1775753750179 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - sha256: 1a9d1e3e18dbb0b87cff3b40c3e42703730d7ac7ee9b9322c2682196a81ba0c3 - md5: 8423c008105df35485e184066cad4566 + size: 954962 + timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 + md5: 6681822ea9d362953206352371b6a904 depends: - __osx >=11.0 - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 920039 - timestamp: 1775754485962 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - sha256: 7a6256ea136936df4c4f3b227ba1e273b7d61152f9811b52157af497f07640b0 - md5: 4152b5a8d2513fd7ae9fb9f221a5595d + size: 920047 + timestamp: 1777987051643 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + sha256: e70562450332ca8954bc16f3455468cca5ef3695c7d7187ecc87f8fc3c70e9eb + md5: 7fea434a17c323256acc510a041b80d7 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 1301855 - timestamp: 1775753831574 + size: 1304178 + timestamp: 1777986510497 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -11311,93 +11476,93 @@ packages: purls: [] size: 292785 timestamp: 1745608759342 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e - md5: 1b08cd684f34175e4514474793d44bcb +- 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_18 + - libgcc 15.2.0 he0feb66_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 purls: [] - size: 5852330 - timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - sha256: b1c3824769b92a1486bf3e2cc5f13304d83ae613ea061b7bc47bb6080d6dfdba - md5: 865a399bce236119301ebd1532fced8d + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + sha256: 1b4263aa5d8c8c659e8e38b66868f42867347e0c8941513ee77269afc00a5186 + md5: d1a866495b9654ccfef5392b8541dc58 depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 20171098 - timestamp: 1771377827750 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda - sha256: 138ee40ba770abf4556ee9981879da9e33299f406a450831b48c1c397d7d0833 - md5: a50630d1810916fc252b2152f1dc9d6d + size: 20199810 + timestamp: 1778268389428 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + sha256: a2385f3611d5cd25378f9cf2367183320731709c067ddd08d43330d3170f15b8 + md5: bcfe7eae40158c3e355d2f9d3ed41230 depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 20669511 - timestamp: 1771378139786 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 - md5: 6235adb93d064ecdf3d44faee6f468de + size: 20765069 + timestamp: 1778268963689 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9 + md5: e5ce228e579726c07255dbf90dc62101 depends: - - libstdcxx 15.2.0 h934c35e_18 + - libstdcxx 15.2.0 h934c35e_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27575 - timestamp: 1771378314494 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - sha256: 4888b9ea2593c36ca587a5ebe38d0a56a0e6d6a9e4bb7da7d9a326aaaca7c336 - md5: 8ed82d90e6b1686f5e98f8b7825a15ef + size: 27776 + timestamp: 1778269074600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + sha256: af6025aa4a4fc3f4e71334000d2739d927e2f678607b109ec630cc17d716918a + md5: b6e326fbe1e3948da50ec29cee0380db depends: - __glibc >=2.17,<3.0.a0 - libevent >=2.1.12,<2.1.13.0a0 - libgcc >=14 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 424208 - timestamp: 1753277183984 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda - sha256: 8b703f2c6e47ed5886d7298601b9416b59e823fc8d1a8fa867192c94c5911aac - md5: 3161023bb2f8c152e4c9aa59bdd40975 + size: 423861 + timestamp: 1777018957474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + sha256: 568bb23db02b050c3903bec05edbcab84960c8c7e5a1710dac3109df997ac7f1 + md5: d006875f9a58a44f92aec9a7ebeb7150 depends: - __osx >=11.0 - libcxx >=19 - libevent >=2.1.12,<2.1.13.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 323360 - timestamp: 1753277264380 -- conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda - sha256: 87516b128ffa497fc607d5da0cc0366dbee1dbcc14c962bf9ea951d480c7698b - md5: 556d49ad5c2ad553c2844cc570bb71c7 + size: 323017 + timestamp: 1777019893083 +- conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda + sha256: 7ffb48755c4fc4a7cca454e4afea286e4fb47e50e153df1b006b14691f0f43d0 + md5: 42856184560e5cf901551fd414ad25c1 depends: - libevent >=2.1.12,<2.1.13.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] - size: 636513 - timestamp: 1753277481158 + size: 634136 + timestamp: 1777019194906 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 md5: cd5a90476766d53e901500df9215e927 @@ -11896,32 +12061,34 @@ packages: purls: [] size: 58347 timestamp: 1774072851498 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.4-hc7d1edf_0.conda - sha256: a269273ccf48be6ac582bb958713ba8373262b9157a0fc76b7e5475e8a1d2a78 - md5: 46d04a647df7a4525e487d88068d19ef +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + sha256: 2cd49562feda2bf324651050b2b035080fd635ed0f1c96c9ce7a59eff3cc0029 + md5: 8a4e2a54034b35bc6fa5bf9282913f45 depends: - __osx >=11.0 constrains: - - openmp 22.1.4|22.1.4.* + - openmp 22.1.5|22.1.5.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 286406 - timestamp: 1776846235007 -- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.4-h4fa8253_0.conda - sha256: 7d827f8c125ac2fe3a9d5b47c1f95fc540bb8ef78685e4bcf941957257bb1eff - md5: 761757ab617e8bfef18cc422dd02bbad + size: 285806 + timestamp: 1778447786965 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.5-h4fa8253_1.conda + sha256: 7179e0266125c3333a097b399d0383734ee6c55fbadf332b447237a596e9698f + md5: bffe599d0eb2e78a32872712178e639c depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: + - openmp 22.1.5|22.1.5.* - intel-openmp <0.0a0 - - openmp 22.1.4|22.1.4.* license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 347999 - timestamp: 1776846360348 + size: 347493 + timestamp: 1778448334890 - pypi: https://files.pythonhosted.org/packages/1c/d4/33c8af00f0bf6f552d74f3a054f648af2c5bc6bece97972f3bfadce4f5ec/llvmlite-0.47.0-cp314-cp314-macosx_12_0_arm64.whl name: llvmlite version: 0.47.0 @@ -11972,10 +12139,10 @@ packages: purls: [] size: 139891 timestamp: 1733741168264 -- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl name: markdown-it-py - version: 4.0.0 - sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 + version: 4.2.0 + sha256: 9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a requires_dist: - mdurl~=0.1 - psutil ; extra == 'benchmarking' @@ -12003,6 +12170,7 @@ packages: - pytest ; extra == 'testing' - pytest-cov ; extra == 'testing' - pytest-regressions ; extra == 'testing' + - pytest-timeout ; extra == 'testing' - requests ; extra == 'testing' requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda @@ -12034,7 +12202,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe?source=compressed-mapping + - pkg:pypi/markupsafe?source=hash-mapping size: 27256 timestamp: 1772445397216 - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda @@ -12054,11 +12222,11 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 30022 timestamp: 1772445159549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py314hdafbbf9_0.conda - sha256: 0c9417291ada8df3415ad13d52db38707adaba42584246264294e0faaaa54f77 - md5: 8286e3966eac286d5ac7c7a4afbac812 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py314hdafbbf9_0.conda + sha256: afe4442ffad64b9a0b26dbcc6aec6dfb9cf453256b50f4e96bada055d014e29c + md5: 2046de06d7f4149a29c5d0e2cc26d6dd depends: - - matplotlib-base >=3.10.8,<3.10.9.0a0 + - matplotlib-base >=3.10.9,<3.10.10.0a0 - pyside6 >=6.7.2 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -12066,26 +12234,26 @@ packages: license: PSF-2.0 license_family: PSF purls: [] - size: 17473 - timestamp: 1763055464987 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.8-py314he55896b_0.conda - sha256: 070b99e48cd6dda06086116626203c100e6f34af771b34384848ce5abeaf683e - md5: ad9a3f773f13989b92b41c0eabed5a38 + size: 17876 + timestamp: 1777000591578 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.9-py314he55896b_0.conda + sha256: eeb9253f5a6c1a5b1251076088a4180f456a2d01048629ac1dc376d2f404e14a + md5: 553de53f80d4eeef68ff2b2ec225ed5f depends: - - matplotlib-base >=3.10.8,<3.10.9.0a0 + - matplotlib-base >=3.10.9,<3.10.10.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - tornado >=5 license: PSF-2.0 license_family: PSF purls: [] - size: 17538 - timestamp: 1763055987021 -- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.8-py314h86ab7b2_0.conda - sha256: e7b6349b12f7d98ab7b595e01e486d3544083c694e8ee2c45a0b8f17016a7a0a - md5: e786fc5fefad7779cb2d954dd214fa37 + size: 17814 + timestamp: 1777001592449 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.9-py314h86ab7b2_0.conda + sha256: d253757f01fa3942d5bf0237a6e1f5e885b4776c41c966da5d3001b7a5857359 + md5: d0f5a1cd8f44e35e736e117c7b6b8fb2 depends: - - matplotlib-base >=3.10.8,<3.10.9.0a0 + - matplotlib-base >=3.10.9,<3.10.10.0a0 - pyside6 >=6.7.2 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -12093,11 +12261,11 @@ packages: license: PSF-2.0 license_family: PSF purls: [] - size: 18016 - timestamp: 1763056036732 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - sha256: ee773261fbd6c76fc8174b0e4e1ce272b0bbaa56610f130e9d3d1f575106f04f - md5: b8683e6068099b69c10dbfcf7204203f + size: 18161 + timestamp: 1777000845679 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda + sha256: 94599b0ca937530f7c7ba1e394cbe8420db613da2524bd0000988e9bbe118f0a + md5: 11a821746ad11e642fcc615c3d66aa44 depends: - __glibc >=2.17,<3.0.a0 - contourpy >=1.0.1 @@ -12105,8 +12273,8 @@ packages: - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libgcc >=14 - libstdcxx >=14 - numpy >=1.23 @@ -12123,11 +12291,11 @@ packages: license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping - size: 8473358 - timestamp: 1763055439346 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - sha256: 198dcc0ed83e78bc7bf48e6ef8d4ecd220e9cf1f07db98508251b2bc0be067f9 - md5: c84152e510d41378b8758826655b6ed7 + size: 8545652 + timestamp: 1777000575998 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.9-py314hc042b31_0.conda + sha256: 8c1912582f457a40e39b9770dc2417c804f5ab1eb1ce73860d24a1414fb56145 + md5: 3252e58ac5ade3ba2dacd5dacfa6e7b8 depends: - __osx >=11.0 - contourpy >=1.0.1 @@ -12136,8 +12304,8 @@ packages: - freetype - kiwisolver >=1.3.1 - libcxx >=19 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - numpy >=1.23 - numpy >=1.23,<3 - packaging >=20.0 @@ -12152,19 +12320,19 @@ packages: license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping - size: 8286510 - timestamp: 1763055937766 -- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda - sha256: 82a50284275e8a1818cd3323846f3032dc89bd23a3f80dcf44e34a62b016256b - md5: 9d491a60700e0e90e92607fcc4e2566c + size: 8315491 + timestamp: 1777001530326 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.9-py314hfa45d96_0.conda + sha256: 9c98854165e99e50aaf3761f1f9efc4e230f0c82bd357ab3426d359de9169441 + md5: f51114063f7f5abd404cff82054e7af2 depends: - contourpy >=1.0.1 - cycler >=0.10 - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - numpy >=1.23 - numpy >=1.23,<3 - packaging >=20.0 @@ -12181,11 +12349,11 @@ packages: license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping - size: 8185296 - timestamp: 1763055983613 -- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - sha256: 9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603 - md5: 00e120ce3e40bad7bfc78861ce3c4a25 + size: 8263442 + timestamp: 1777000826825 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764 + md5: 9acc1c385be401d533ff70ef5b50dae6 depends: - python >=3.10 - traitlets @@ -12193,8 +12361,8 @@ packages: license_family: BSD purls: - pkg:pypi/matplotlib-inline?source=hash-mapping - size: 15175 - timestamp: 1761214578417 + size: 15725 + timestamp: 1778264403247 - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl name: mdurl version: 0.1.2 @@ -12213,9 +12381,9 @@ packages: - pkg:pypi/memory-profiler?source=hash-mapping size: 36168 timestamp: 1764885507963 -- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - sha256: d3fb4beb5e0a52b6cc33852c558e077e1bfe44df1159eb98332d69a264b14bae - md5: b11e360fc4de2b0035fc8aaa74f17fd6 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + sha256: b52dc6c78fbbe7a3008535cb8bfd87d70d8053e9250bbe16e387470a9df07070 + md5: b97e84d1553b4a1c765b87fff83453ad depends: - python >=3.10 - typing_extensions @@ -12224,23 +12392,23 @@ packages: license_family: BSD purls: - pkg:pypi/mistune?source=hash-mapping - size: 74250 - timestamp: 1766504456031 -- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_12.conda - sha256: d7b8343e10053c8527e2e20fd96787d368c97129ffa799e863069a36bd299457 - md5: a3b1ee571898432da7e13ecb7bfd76ae + size: 74567 + timestamp: 1777824616382 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.0.0-hac47afa_906.conda + sha256: 5d6c0c02588a655aaaced67f25d1967810830d4336865e319f32cfb41d08de06 + md5: fada5d30be6e95c74ffc528f70268f02 depends: - - llvm-openmp >=22.1.4 - - onemkl-license 2025.3.1 h57928b3_12 - - tbb >=2022.3.0 + - llvm-openmp >=22.1.5 + - onemkl-license 2026.0.0 h57928b3_906 + - tbb >=2023.0.0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] - size: 100112670 - timestamp: 1776904283842 + size: 114608976 + timestamp: 1778776186500 - pypi: https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl name: ml-dtypes version: 0.5.4 @@ -12302,6 +12470,15 @@ packages: - sphinx ; extra == 'docs' - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' - pytest>=4.6 ; extra == 'tests' +- pypi: https://files.pythonhosted.org/packages/25/1f/cca084ca2572810fff12ea9dbdcbe39eac048f40daf4a9077b49fcbe8cee/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: msgspec + version: 0.21.1 + sha256: 3d6b9dc50948eaf65df54d2fd0ff66e6d8c32f116037209ee861810eb9b676cb + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 md5: 37293a85a0f4f77bbd9cf7aaefc62609 @@ -12313,9 +12490,9 @@ packages: - pkg:pypi/munkres?source=hash-mapping size: 15851 timestamp: 1749895533014 -- conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.8.3-pyhcf101f3_0.conda - sha256: eef3ec4ad6f83e8e20a84d18bd6a70ca21a38ee4144a5a6c010a20574d40f292 - md5: a44086c58b2f81dc318ded3c107d6afd +- conda: https://conda.anaconda.org/conda-forge/noarch/mystmd-1.9.0-pyhcf101f3_0.conda + sha256: 3013798e47c4cc6dacd1a780ce4300141762611a23ef6e4327609045a7389e8a + md5: cdb96e61fa01be8d8aa62e96d4d98821 depends: - python >=3.10 - nodejs >=18 @@ -12324,20 +12501,19 @@ packages: license_family: MIT purls: - pkg:pypi/mystmd?source=hash-mapping - size: 2183857 - timestamp: 1775082702883 -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda - sha256: 676cbfbf709ce984a14e3af5aef70f1ec94a29ea3fdec477115ae302b34a1a2d - md5: 6cac1a50359219d786453c6fef819f98 + size: 2184222 + timestamp: 1777661767917 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda + sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 + md5: 6687827c332121727ce383919e1ec8c2 depends: - python >=3.10 - python license: MIT - license_family: MIT purls: - pkg:pypi/narwhals?source=compressed-mapping - size: 283664 - timestamp: 1776691974709 + size: 284323 + timestamp: 1778929680962 - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b md5: 00f5b8dafa842e0c27c1cd7296aa4875 @@ -12350,7 +12526,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/nbclient?source=compressed-mapping + - pkg:pypi/nbclient?source=hash-mapping size: 28473 timestamp: 1766485646962 - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda @@ -12380,7 +12556,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/nbconvert?source=compressed-mapping + - pkg:pypi/nbconvert?source=hash-mapping size: 202229 timestamp: 1775615493260 - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda @@ -12398,25 +12574,25 @@ packages: - pkg:pypi/nbformat?source=hash-mapping size: 100945 timestamp: 1733402844974 -- 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-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: X11 AND BSD-3-Clause purls: [] - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 depends: - __osx >=11.0 license: X11 AND BSD-3-Clause purls: [] - size: 797030 - timestamp: 1738196177597 + size: 805509 + timestamp: 1777423252320 - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 md5: 598fd7d4d0de2455fb74f56063969a97 @@ -12570,76 +12746,73 @@ packages: - pkg:pypi/notebook-shim?source=hash-mapping size: 16817 timestamp: 1733408419340 -- pypi: https://files.pythonhosted.org/packages/24/8d/e12d6ff4b9119db3cbf7b2db1ce257576441bd3c76388c786dea74f20b02/numba-0.65.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl name: numba - version: 0.65.0 - sha256: 05c0a9fdf75d85f57dee47b719e8d6415707b80aae45d75f63f9dc1b935c29f7 + version: 0.65.1 + sha256: 33f5eb68eb1c843511615d14663ce60258525d6a4c65ab040e2c2b0c4cf17450 requires_dist: - llvmlite>=0.47.0.dev0,<0.48 - numpy>=1.22 - numpy>=1.22,<2.5 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/56/a4/90edb01e9176053578e343d7a7276bc28356741ee67059aed8ed2c1a4e59/numba-0.65.0-cp314-cp314-macosx_12_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/56/46/3f7fc04fb853559e74b210e0b62c19974ec844cefec611f9e535f4da3761/numba-0.65.1-cp314-cp314-win_amd64.whl name: numba - version: 0.65.0 - sha256: ee336b398a6fca51b1f626034de99f50cb1bd87d537a166275158a3cee744b82 + version: 0.65.1 + sha256: 2a20fcdabdefbdacf88d85caf70c3b18c4bcb7ebb8f82e6a19486383dd26ab63 requires_dist: - llvmlite>=0.47.0.dev0,<0.48 - numpy>=1.22 - numpy>=1.22,<2.5 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/73/5b/fbce55ce3d933afbc7ade04df826853e4a846aaa47d58d2fbb669b8f2d08/numba-0.65.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: numba - version: 0.65.0 - sha256: add297d3e1c08dd884f44100152612fa41e66a51d15fdf91307f9dde31d06830 + version: 0.65.1 + sha256: 71e73029bf53a62cc6afcf96be4bd942290d8b4c55f0a454fb536158115790f7 requires_dist: - llvmlite>=0.47.0.dev0,<0.48 - numpy>=1.22 - numpy>=1.22,<2.5 requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec - md5: 36f5b7eb328bdc204954a2225cf908e2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda + sha256: 8e796bac2558ff5f2d00a2d0bbe4821d518347a8f70afb53b5acf27adb135197 + md5: 64a8d5cd0553d51590a304a28c184785 depends: - python - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 - - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/numpy?source=hash-mapping - size: 8927860 - timestamp: 1773839233468 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - sha256: fe565b09011e8b8edb11bc20564ab130b107d4717590c2464d6d7c2a5a53c6da - md5: 0fab9cf4fc5163131387f36742b50c79 + - pkg:pypi/numpy?source=compressed-mapping + size: 8930431 + timestamp: 1778894356567 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.5-py314hb79c6fa_0.conda + sha256: 97a9c791cd8f27711b8a73dfcd895b3915e065f05366c2d868524f43d299273a + md5: 38411f00bb92c9cfbd7760037c5d647b depends: - python - libcxx >=19 - - python 3.14.* *_cp314 - __osx >=11.0 + - python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/numpy?source=hash-mapping - size: 6993182 - timestamp: 1773839150339 -- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - sha256: e4afa67a7350836a1d652f8e7351fe4cb853f8eb8b5c86c9203cefff67669083 - md5: 54355aaff5c94c602b7b9540fbc3ca1d + - pkg:pypi/numpy?source=compressed-mapping + size: 6993432 + timestamp: 1778894368347 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.5-py314h02f10f6_0.conda + sha256: 44a4d599511779ecb615ca4101e9a7b93d4c5bb6d8c1ccbd951ff27084a8fd87 + md5: 212966402b4911c332087a17254f386c depends: - python - vc >=14.3,<15 @@ -12652,11 +12825,10 @@ packages: constrains: - numpy-base <0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/numpy?source=hash-mapping - size: 7311362 - timestamp: 1773839141373 + - pkg:pypi/numpy?source=compressed-mapping + size: 7315426 + timestamp: 1778894390109 - conda: https://conda.anaconda.org/conda-forge/noarch/numpy-typing-compat-20251206.2.4-pyhd6139ff_0.conda sha256: 7e5d83982e309d0e4196f3d3d370d91eb6f2a24336c44fcc8c0b6dc903486983 md5: 5d93ad80a62295da5f6950227ea72c66 @@ -12671,10 +12843,10 @@ packages: - pkg:pypi/numpy-typing-compat?source=hash-mapping size: 13975 timestamp: 1767188739549 -- pypi: https://files.pythonhosted.org/packages/3d/ec/c9b2998aebe3149dee2769e501257e048c8701de51263925f4dff76ddedc/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/f8/79/0cefdaa1d9e45018a227bac64a79b92d2733cde28a8fd09c65362de08622/nvidia_cublas-13.4.1.1-py3-none-manylinux_2_27_x86_64.whl name: nvidia-cublas - version: 13.4.0.1 - sha256: 53bf22e2ccbf644db74b6cc21cea7f5efb1a52aa64515438b430abbd05af4106 + version: 13.4.1.1 + sha256: 28c983c8c03aa9a2d7b36cddcef2bfeeea85e13241d77df7622665502159f347 requires_dist: - nvidia-cuda-nvrtc requires_python: '>=3' @@ -12744,17 +12916,17 @@ packages: version: 12.9.79 sha256: 25bba2dfb01d48a9b59ca474a1ac43c6ebf7011f1b0b8cc44f54eb6ac48a96c3 requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/3c/8e/0c3aeef5f8a9507ad0b2d6fb3f28f38997cda1c7e7f614adc00ceb64a901/nvidia_cudnn_cu12-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a0/8f/2ede6b758b7524608472010f632bdd3370ea271d715d1d66044614b84cdc/nvidia_cudnn_cu12-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl name: nvidia-cudnn-cu12 - version: 9.21.1.3 - sha256: ffd5bf372071423c441f1de01af35abd6b6f3921a8ab80b23db8ba69a12131b0 + version: 9.22.0.52 + sha256: 391b9a7ee6386daaca7f8dca41e83c2c99f760c9581a0400755e87b4287b8847 requires_dist: - nvidia-cublas-cu12 requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/85/be/68e659d798aaad24817f10acbad952491b43df668376b704618296887f62/nvidia_cudnn_cu13-9.21.1.3-py3-none-manylinux_2_27_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/57/96/ce2cb84b5e8bb94dd55f554e3454b91e9ecd6708aa27d4a7b12f287613bc/nvidia_cudnn_cu13-9.22.0.52-py3-none-manylinux_2_27_x86_64.whl name: nvidia-cudnn-cu13 - version: 9.21.1.3 - sha256: 7fa0250b9b0841d4ce41486d777d01160247235ddb8e2ea89e5fcfa4b4c66cd4 + version: 9.22.0.52 + sha256: 7b24277af8cd2e4e5be731f5cf910255105d4b92481999771b99dbffee75d03e requires_dist: - nvidia-cublas requires_python: '>=3' @@ -12843,14 +13015,14 @@ packages: version: 13.2.78 sha256: f5aa433631109bbdec81802c5b5f319bf10bc891fe2f212e4e445845211d6f77 requires_python: '>=3' -- conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2025.3.1-h57928b3_12.conda - sha256: 03eac4174077397a5bc480021e62412e73e80f34072d81053899f65dfe1045c7 - md5: 29ad104e60faa7ed1dc549ec029764bb +- conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_906.conda + sha256: 2c62b4b31da810043a47014a410c546015fcc17f39d8929ba989b2f0086dc71f + md5: 331614e966c27e5ec2a9715c9d17e9a0 license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] - size: 40890 - timestamp: 1776904134221 + size: 41154 + timestamp: 1778775952813 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d md5: 11b3379b191f63139e29c0d19dee24cd @@ -12967,13 +13139,14 @@ packages: - sqlalchemy>=1.3 - typing-extensions requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fe/16/00261f20f467b9e8950a76ec1749f01359bf47f2fc3dac5e206de99835c0/optree-0.19.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/9c/1a/4834b1f2fb1847412353d7342eb7a1d001a4f3bd9d24155e057135a4aa44/optree-0.19.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: optree - version: 0.19.0 - sha256: fb220bb85128c8de71aeffb9c38be817569e4bca413b38d5e0de11ba6471ef4a + version: 0.19.1 + sha256: 3d0e1493429ae1d1a5e34855774ee604c974a8f76656bd0e562cdbf9466c9b1f requires_dist: - typing-extensions>=4.6.0 - typing-extensions>=4.12.0 ; python_full_version >= '3.13' + - attrs ; extra == 'attrs' - jax ; extra == 'jax' - numpy ; extra == 'numpy' - torch ; extra == 'torch' @@ -13003,37 +13176,36 @@ packages: - sphinx-rtd-theme ; extra == 'docs' - sphinxcontrib-bibtex ; extra == 'docs' - docutils ; extra == 'docs' + - attrs ; extra == 'docs' - jax[cpu] ; extra == 'docs' - numpy ; extra == 'docs' - torch ; extra == 'docs' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/optype-0.17.0-pyhc364b38_0.conda - sha256: 3ab9de4022c1ae8e3fe98677e9e599048fbe42ae31e2468ecf0c1c765743fd56 - md5: da9da5767306c6fd9488917e4d0b16c3 +- conda: https://conda.anaconda.org/conda-forge/noarch/optype-0.17.1-pyhc364b38_0.conda + sha256: f24c0f0079e59da6805940f7ef07f162753d7f5f45b119b94c5b7b77d69a3e58 + md5: 778ad501a956ef4097f1745f7d87c877 depends: - python >=3.11 - typing-extensions >=4.10 - python license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/optype?source=hash-mapping - size: 58603 - timestamp: 1773012417794 -- conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.0-pyhada4073_0.conda - sha256: 0459e7589a7bb76be1230d8a2737548322e8483b5370a1c35a16651f76c64f8b - md5: d756c951c6a80171d8dba6136347c070 + size: 58476 + timestamp: 1779057587870 +- conda: https://conda.anaconda.org/conda-forge/noarch/optype-numpy-0.17.1-pyh3cfb546_0.conda + sha256: 079480a4ad35bf4cc887afac73e0cb6bf6977e99d23c4c0e971435608f485913 + md5: 109f922b55bac042f1f815c80ff617ba depends: - python >=3.11 - numpy >=1.26,<2.7 - numpy-typing-compat >=20250818.1.26,<20251207.1.0 - - optype ==0.17.0 pyhc364b38_0 + - optype ==0.17.1 pyhc364b38_0 - python license: BSD-3-Clause - license_family: BSD purls: [] - size: 10983 - timestamp: 1773012417794 + size: 10746 + timestamp: 1779057587870 - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda sha256: a60c2578c8422e0c67206d269767feb4d3e627511558b6866e5daf2231d5214d md5: 8027fce94fdfdf2e54f9d18cbae496df @@ -13105,22 +13277,22 @@ packages: - pkg:pypi/overrides?source=hash-mapping size: 30139 timestamp: 1734587755455 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - sha256: 171d977bc977fd80f2a05de3d4b7d571c4ec3cdea436ed364e5cd50547c50881 - md5: b8ae38639d323d808da535fb71e31be8 +- 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 purls: - - pkg:pypi/packaging?source=compressed-mapping - size: 89360 - timestamp: 1776209387231 -- pypi: https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pkg:pypi/packaging?source=hash-mapping + size: 91574 + timestamp: 1777103621679 +- pypi: https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl name: pandas - version: 3.0.2 - sha256: deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535 + version: 3.0.3 + sha256: 3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -13168,7 +13340,7 @@ packages: - pyqt5>=5.15.9 ; extra == 'clipboard' - qtpy>=2.4.2 ; extra == 'clipboard' - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' + - pytz>=2020.1 ; extra == 'timezone' - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - beautifulsoup4>=4.12.3 ; extra == 'all' @@ -13194,7 +13366,7 @@ packages: - pytest>=8.3.4 ; extra == 'all' - pytest-xdist>=3.6.1 ; extra == 'all' - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - qtpy>=2.4.2 ; extra == 'all' - scipy>=1.14.1 ; extra == 'all' @@ -13207,10 +13379,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas - version: 3.0.2 - sha256: 0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288 + version: 3.0.3 + sha256: 9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -13258,7 +13430,7 @@ packages: - pyqt5>=5.15.9 ; extra == 'clipboard' - qtpy>=2.4.2 ; extra == 'clipboard' - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' + - pytz>=2020.1 ; extra == 'timezone' - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - beautifulsoup4>=4.12.3 ; extra == 'all' @@ -13284,7 +13456,7 @@ packages: - pytest>=8.3.4 ; extra == 'all' - pytest-xdist>=3.6.1 ; extra == 'all' - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - qtpy>=2.4.2 ; extra == 'all' - scipy>=1.14.1 ; extra == 'all' @@ -13297,10 +13469,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl name: pandas - version: 3.0.2 - sha256: b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf + version: 3.0.3 + sha256: bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -13348,7 +13520,7 @@ packages: - pyqt5>=5.15.9 ; extra == 'clipboard' - qtpy>=2.4.2 ; extra == 'clipboard' - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' + - pytz>=2020.1 ; extra == 'timezone' - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - beautifulsoup4>=4.12.3 ; extra == 'all' @@ -13374,7 +13546,7 @@ packages: - pytest>=8.3.4 ; extra == 'all' - pytest-xdist>=3.6.1 ; extra == 'all' - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - qtpy>=2.4.2 ; extra == 'all' - scipy>=1.14.1 ; extra == 'all' @@ -13411,9 +13583,9 @@ packages: - pkg:pypi/pandocfilters?source=hash-mapping size: 11627 timestamp: 1631603397334 -- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94 - md5: 97c1ce2fffa1209e7afb432810ec6e12 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e + md5: 39894c952938276405a1bd30e4ce2caf depends: - python >=3.10 - python @@ -13421,8 +13593,8 @@ packages: license_family: MIT purls: - pkg:pypi/parso?source=hash-mapping - size: 82287 - timestamp: 1770676243987 + size: 82472 + timestamp: 1777722955579 - pypi: https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl name: pathlib-abc version: 0.5.2 @@ -13582,7 +13754,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs?source=compressed-mapping + - pkg:pypi/platformdirs?source=hash-mapping size: 25862 timestamp: 1775741140609 - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda @@ -13597,7 +13769,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/plotly?source=compressed-mapping + - pkg:pypi/plotly?source=hash-mapping size: 5251872 timestamp: 1772628857717 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda @@ -13609,7 +13781,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pluggy?source=compressed-mapping + - pkg:pypi/pluggy?source=hash-mapping size: 25877 timestamp: 1764896838868 - pypi: https://files.pythonhosted.org/packages/da/9e/21c4088d1d433cfbf0578f138a6df59527dbd9e9d67355ee31b17e6dc774/portion-2.6.1-py3-none-any.whl @@ -13619,9 +13791,9 @@ packages: requires_dist: - sortedcontainers~=2.2 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.10-hb17b654_0.conda - sha256: 9442c1195eaa4167cc7b21ea3bd1e7ec94129998e606584479588fa18b0591d8 - md5: a8252316cb85fd80192018604181759b +- conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.4.0-hb17b654_0.conda + sha256: ae3ce60cd7215b04e0499c6986fa821a137ae738dffdd1b1f35cdf7b9e089cdd + md5: 0191ccc9cb65fcb8e00b668ac10d2be7 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -13629,30 +13801,30 @@ packages: - __glibc >=2.17 license: MIT purls: [] - size: 5852661 - timestamp: 1776778241538 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.10-h6fdd925_0.conda - sha256: 35881b9207adf8ac226e7cca09129dbb147a626f0015e09a4c42bc4fc729d4dd - md5: 2adf0a690252af3b7ef9ef38e88ac7ea + size: 5930558 + timestamp: 1778760368958 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.4.0-h6fdd925_0.conda + sha256: 332120f7179e5f4cef56a3bb7bb4887f7ce2ff8f4347e2fe6ef33dd28293249d + md5: e02fa7591f1947d64ff730302c69da56 depends: - __osx >=11.0 constrains: - __osx >=11.0 license: MIT purls: [] - size: 5418706 - timestamp: 1776778575197 -- conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.3.10-h18a1a76_0.conda - sha256: 05ff34464aa9f3dca745bb24e1f3072352190f9dd6ba31739f6d515c2e268b1e - md5: 2d88de0604c4b8145a2305605c99d765 + size: 5524733 + timestamp: 1778760475939 +- conda: https://conda.anaconda.org/conda-forge/win-64/prek-0.4.0-h18a1a76_0.conda + sha256: 4967a93f96809043c01058882c0e5f6c96cbdeb2cf517ff04735e2baf22fee85 + md5: d708a878f88b37234ff3eef6bd5b3d19 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 license: MIT purls: [] - size: 6214766 - timestamp: 1776778293394 + size: 6283077 + timestamp: 1778760414491 - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc md5: a83f6a2fdc079e643237887a37460668 @@ -13705,7 +13877,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/prometheus-client?source=compressed-mapping + - pkg:pypi/prometheus-client?source=hash-mapping size: 57113 timestamp: 1775771465170 - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -13831,8 +14003,8 @@ packages: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 license: Apache-2.0 - purls: - - pkg:pypi/pyarrow?source=compressed-mapping + license_family: APACHE + purls: [] size: 26828 timestamp: 1776927974177 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py314he55896b_0.conda @@ -13847,6 +14019,7 @@ packages: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 license: Apache-2.0 + license_family: APACHE purls: [] size: 26896 timestamp: 1776928739464 @@ -13862,6 +14035,7 @@ packages: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 license: Apache-2.0 + license_family: APACHE purls: [] size: 27124 timestamp: 1776928424429 @@ -13881,8 +14055,9 @@ packages: - apache-arrow-proc * cpu - numpy >=1.23,<3 license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/pyarrow?source=compressed-mapping + - pkg:pypi/pyarrow?source=hash-mapping size: 4818190 timestamp: 1776927934653 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py314h109bba2_0_cpu.conda @@ -13901,6 +14076,7 @@ packages: - apache-arrow-proc * cpu - numpy >=1.23,<3 license: Apache-2.0 + license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 4334926 @@ -13922,6 +14098,7 @@ packages: - numpy >=1.23,<3 - libprotobuf >=6.33.5 license: Apache-2.0 + license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 3670958 @@ -13957,16 +14134,16 @@ packages: license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pygments?source=compressed-mapping + - pkg:pypi/pygments?source=hash-mapping size: 893031 timestamp: 1774796815820 - pypi: ./ name: pylcm - version: 0.0.2.dev131+g4a05a8283.d20260511 - sha256: 4f354caf09e81582a5adb942f82bd7f91aafbac5a9eeaacb931f28bd1d0499dc + version: 0.0.2.dev236+g36a531ce4.d20260518 + sha256: 4cac37f325771919acfcd5274aafebe4f14e219107baed018e75697cf79dd1cd requires_dist: + - beartype>=0.21 - cloudpickle>=3.1.2 - - dags>=0.5.1 - h5py>=3.12 - jax>=0.9 - jaxtyping>=0.3.2 @@ -14028,10 +14205,10 @@ packages: - pkg:pypi/pyparsing?source=hash-mapping size: 110893 timestamp: 1769003998136 -- pypi: https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl name: pyreadline3 - version: 3.5.4 - sha256: eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6 + version: 3.5.6 + sha256: 8449b734232e42a5dcd74048e39b60db2839a4c38cf3ae2bf7707d58b5389c0d requires_dist: - build ; extra == 'dev' - flake8 ; extra == 'dev' @@ -14039,55 +14216,51 @@ packages: - pytest ; extra == 'dev' - twine ; extra == 'dev' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py314h3987850_2.conda - sha256: 7102df4eeb04fb8746b336ddd03d3f98a5c6d4742c173de582e609e2f92ffec8 - md5: c77e1fe23b6cf0b6077e5f924ac420c9 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.1-py314h3987850_1.conda + sha256: e410d0d4151f418dc75ea2dc38dfb0e7a136090b6874e5ca1c699fa840b4994d + md5: 5d2051f0630a568926943fc53c0aaa4c depends: - python - - qt6-main 6.11.0.* + - qt6-main 6.11.1.* + - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 - libxslt >=1.1.43,<2.0a0 + - libegl >=1.7.0,<2.0a0 - python_abi 3.14.* *_cp314 - - libclang13 >=21.1.8 - - libgl >=1.7.0,<2.0a0 - - qt6-main >=6.11.0,<6.12.0a0 + - qt6-main >=6.11.1,<6.12.0a0 + - libclang13 >=22.1.5 - libxml2 - libxml2-16 >=2.14.6 - - libegl >=1.7.0,<2.0a0 - - libvulkan-loader >=1.4.341.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 license: LGPL-3.0-only - license_family: LGPL purls: - - pkg:pypi/pyside6?source=hash-mapping - - pkg:pypi/shiboken6?source=hash-mapping - size: 13376566 - timestamp: 1776276343130 -- conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.0-py314h447aaf0_2.conda - sha256: b60387b44ac5c5fa014cb5f25c710bf77dba2e2f0bdd07f76da406aa9e6fc28b - md5: 1d7f556ad3222af1acff0048d3e25539 + - pkg:pypi/pyside6?source=compressed-mapping + size: 13821776 + timestamp: 1778933872780 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.1-py314h447aaf0_1.conda + sha256: 070802d5e1e1c1feb24d481efbd90b300fb0ecc1ce4312a3bbcbaae4393c05f9 + md5: 638be6b8674e7acf7a84132903cf4c8e depends: - python - - qt6-main 6.11.0.* + - qt6-main 6.11.1.* - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 + - libxslt >=1.1.43,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 + - qt6-main >=6.11.1,<6.12.0a0 - python_abi 3.14.* *_cp314 - libvulkan-loader >=1.4.341.0,<2.0a0 - - qt6-main >=6.11.0,<6.12.0a0 - - libclang13 >=21.1.8 - - libxslt >=1.1.43,<2.0a0 + - libclang13 >=22.1.5 license: LGPL-3.0-only - license_family: LGPL purls: - - pkg:pypi/pyside6?source=hash-mapping - - pkg:pypi/shiboken6?source=hash-mapping - size: 11209595 - timestamp: 1776276413741 + - pkg:pypi/pyside6?source=compressed-mapping + size: 11579652 + timestamp: 1778933912020 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca md5: e2fd202833c4a981ce8a65974fe4abd1 @@ -14113,15 +14286,15 @@ packages: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 -- pypi: https://files.pythonhosted.org/packages/80/b2/bba963dfce0fcbc5020a4f8b4361e132390c4bd78b46cfc7ae355e678b96/pytask-0.5.8-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/d7/54/c30cb1d08258612ece1dfa72c6918998bebecb916c54fca6d806bc780f2b/pytask-0.6.0-py3-none-any.whl name: pytask - version: 0.5.8 - sha256: 217ed6b3e12140c442afa5e333bbb91e98f8d4fd5c746d323fbbf9778985a92f + version: 0.6.0 + sha256: cc4c31ead39f5c64be037640f7bf589b68bd0e87ea9e1a049ba86ceab42c9d13 requires_dist: - - attrs>=21.3.0 - click>=8.1.8,!=8.2.0 - click-default-group>=1.2.4 - - networkx>=2.4.0 + - msgspec>=0.18.6 + - msgspec[toml]>=0.18.6 - optree>=0.9.0 - packaging>=23.0.0 - pluggy>=1.3.0 @@ -14130,6 +14303,7 @@ packages: - tomli>=1 ; python_full_version < '3.11' - typing-extensions>=4.8.0 ; python_full_version < '3.11' - universal-pathlib>=0.2.2 + - networkx>=2.4.0 ; extra == 'dag' requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda sha256: 960f59442173eee0731906a9077bd5ccf60f4b4226f05a22d1728ab9a21a879c @@ -14149,7 +14323,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest?source=compressed-mapping + - pkg:pypi/pytest?source=hash-mapping size: 299984 timestamp: 1775644472530 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda @@ -14164,7 +14338,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-cov?source=compressed-mapping + - pkg:pypi/pytest-cov?source=hash-mapping size: 29559 timestamp: 1774139250481 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda @@ -14273,20 +14447,19 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - sha256: 498ad019d75ba31c7891dc6d9efc8a7ed48cd5d5973f3a9377eb1b174577d3db - md5: feb2e11368da12d6ce473b6573efab41 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda + sha256: 4a44f16a36fec7125b72d5a57bea963fa9deadccf65e29bb5ca610cd1d5cc0af + md5: 45ea5eceb1c2e35a08a834869837a090 depends: - python >=3.10 - filelock >=3.15.4 - platformdirs <5,>=4.3.6 - python license: MIT - license_family: MIT purls: - - pkg:pypi/python-discovery?source=hash-mapping - size: 34341 - timestamp: 1775586706825 + - pkg:pypi/python-discovery?source=compressed-mapping + size: 35067 + timestamp: 1778678120896 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 md5: 23029aae904a2ba587daba708208012f @@ -14309,28 +14482,29 @@ packages: purls: [] size: 49806 timestamp: 1775614307464 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca - md5: a61bf9ec79426938ff785eb69dbb1960 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-3.2.1-pyh332efcf_0.conda + sha256: 1c55116c22512cef7b01d55ae49697707f2c1fd829407183c19817e2d300fd8d + md5: 1cd2f3e885162ee1366312bd1b1677fd depends: - - python >=3.6 + - python >=3.10 + - typing_extensions license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/python-json-logger?source=hash-mapping - size: 13383 - timestamp: 1677079727691 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda - sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc - md5: d8d30923ccee7525704599efd722aa16 + size: 18969 + timestamp: 1777318679482 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda + sha256: e943f9c15a6bdba2e1b9f423ab913b3f6b02197b0ef9f8e6b7464d78b59965b9 + md5: f6ad7450fc21e00ecc23812baed6d2e4 depends: - python >=3.10 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/tzdata?source=compressed-mapping - size: 147315 - timestamp: 1775223532978 + - pkg:pypi/tzdata?source=hash-mapping + size: 146639 + timestamp: 1777068997932 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 @@ -14507,9 +14681,9 @@ packages: purls: [] size: 1377020 timestamp: 1720814433486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda - sha256: d2cb212a4abd66c13df44771c22ee23c0b013ba1d5dbb5e10e8a13e261a47c6b - md5: c81127acb50fdc7760682495fc9ab088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.1-pl5321h16c4a6b_0.conda + sha256: 787d9a8eb7bb993e4a543901b8edade35c1c8e75d67cadb65c56a8f9c38119a5 + md5: cdae26862f9e4c674b8443fd267f2401 depends: - libxcb - xcb-util @@ -14520,100 +14694,100 @@ packages: - xcb-util-cursor - libgl-devel - libegl-devel - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - - libvulkan-loader >=1.4.341.0,<2.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - libgl >=1.7.0,<2.0a0 - - libegl >=1.7.0,<2.0a0 - - openssl >=3.5.6,<4.0a0 - - dbus >=1.16.2,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 - - krb5 >=1.22.2,<1.23.0a0 - - fontconfig >=2.17.1,<3.0a0 - - fonts-conda-ecosystem - - libxcb >=1.17.0,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - - xorg-libxcomposite >=0.4.7,<1.0a0 - - xorg-libxxf86vm >=1.1.7,<2.0a0 - - icu >=78.3,<79.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - wayland >=1.25.0,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - xcb-util-keysyms >=0.4.1,<0.5.0a0 - xorg-libxcursor >=1.2.3,<2.0a0 - double-conversion >=3.4.0,<3.5.0a0 - - alsa-lib >=1.2.15.3,<1.3.0a0 - - xorg-libxext >=1.3.7,<2.0a0 - - harfbuzz >=14.1.0 - - libsqlite >=3.53.0,<4.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libtiff >=4.7.1,<4.8.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - xcb-util-wm >=0.4.2,<0.5.0a0 - - libcups >=2.3.3,<2.4.0a0 + - dbus >=1.16.2,<2.0a0 + - libglib >=2.88.1,<3.0a0 + - libsqlite >=3.53.1,<4.0a0 - xorg-libx11 >=1.8.13,<2.0a0 - - libpng >=1.6.58,<1.7.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - harfbuzz >=14.2.0 - xorg-libice >=1.1.2,<2.0a0 - - xorg-libxrandr >=1.5.5,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 - libbrotlicommon >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - openssl >=3.5.6,<4.0a0 - xcb-util-cursor >=0.1.6,<0.2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - xorg-libxxf86vm >=1.1.7,<2.0a0 + - icu >=78.3,<79.0a0 + - libxcb >=1.17.0,<2.0a0 + - wayland >=1.25.0,<2.0a0 - xorg-libsm >=1.2.6,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libpq >=18.3,<19.0a0 - - libglib >=2.86.4,<3.0a0 + - libegl >=1.7.0,<2.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - xorg-libxtst >=1.2.5,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libcups >=2.3.3,<2.4.0a0 + - libgl >=1.7.0,<2.0a0 + - xcb-util >=0.4.1,<0.5.0a0 constrains: - - qt ==6.11.0 + - qt ==6.11.1 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 59928585 - timestamp: 1776322501700 -- conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.0-pl5321hfcac499_4.conda - sha256: c7b7e8f40e393837de5f7f50b8da0ba2d42df64069d1d587b3761fa5e2f7d018 - md5: 1aca2896ea9f0d1f0761a7b278f670a0 + size: 60185269 + timestamp: 1778597122245 +- conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.1-pl5321hfcac499_0.conda + sha256: 362210095bc596fa32a38f04384db95b3f71f33c84d617e0d8fd1868dd2a89cd + md5: ae7392b852564d9f4f506dfc4ded3c6a depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - libvulkan-loader >=1.4.341.0,<2.0a0 + - harfbuzz >=14.2.0 + - icu >=78.3,<79.0a0 - krb5 >=1.22.2,<1.23.0a0 - - libsqlite >=3.53.0,<4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - zstd >=1.5.7,<1.6.0a0 + - openssl >=3.5.6,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libbrotlicommon >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - - libglib >=2.86.4,<3.0a0 - pcre2 >=10.47,<10.48.0a0 - - libpng >=1.6.57,<1.7.0a0 - - icu >=78.3,<79.0a0 - - openssl >=3.5.6,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - double-conversion >=3.4.0,<3.5.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - libzlib >=1.3.2,<2.0a0 + - libglib >=2.88.1,<3.0a0 - libfreetype >=2.14.3 - libfreetype6 >=2.14.3 - - harfbuzz >=14.1.0 - - libwebp-base >=1.6.0,<2.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 constrains: - - qt ==6.11.0 + - qt ==6.11.1 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 89539622 - timestamp: 1776298520993 + size: 89576147 + timestamp: 1778597003415 - pypi: https://files.pythonhosted.org/packages/cb/3b/ef57eeb4c6f188fbe756b602dc6afa9d66eb0c2e77f02a3d4d51bfec2aaa/quantecon-0.11.2-py3-none-any.whl name: quantecon version: 0.11.2 @@ -14701,9 +14875,9 @@ packages: - pkg:pypi/referencing?source=hash-mapping size: 51788 timestamp: 1760379115194 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda - sha256: c0249bc4bf4c0e8e06d0e7b4d117a5d593cc4ab2144d5006d6d47c83cb0af18e - md5: 10afbb4dbf06ff959ad25a92ccee6e59 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 depends: - python >=3.10 - certifi >=2023.5.7 @@ -14712,13 +14886,12 @@ packages: - urllib3 >=1.26,<3 - python constrains: - - chardet >=3.0.2,<6 + - chardet >=3.0.2,<8 license: Apache-2.0 - license_family: APACHE purls: - pkg:pypi/requests?source=compressed-mapping - size: 63712 - timestamp: 1774894783063 + size: 68709 + timestamp: 1778851103479 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5 md5: 36de09a8d3e5d5e6f4ee63af49e59706 @@ -14811,18 +14984,18 @@ packages: - pkg:pypi/rpds-py?source=hash-mapping size: 235780 timestamp: 1764543046065 -- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda - sha256: dbbe4ab36b90427f12d69fc14a8b601b6bca4185c6c4dd67b8046a8da9daec03 - md5: 9d978822b57bafe72ebd3f8b527bba71 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda + sha256: 856866fd519b812db3e092aba308248dd87b5c308186fcffe593f309373ae94c + md5: 3f578c7d2b0bb52469340e4060d48d94 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 395083 - timestamp: 1773251675551 + size: 387306 + timestamp: 1777466173323 - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda sha256: 1ae427836d7979779c9005388a05993a3addabcc66c4422694639a4272d7d972 md5: d0510124f87c75403090e220db1e9d41 @@ -14843,7 +15016,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy?source=compressed-mapping + - pkg:pypi/scipy?source=hash-mapping size: 17225275 timestamp: 1771880751368 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda @@ -14954,7 +15127,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/setuptools?source=compressed-mapping + - pkg:pypi/setuptools?source=hash-mapping size: 639697 timestamp: 1773074868565 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -15119,10 +15292,10 @@ packages: purls: [] size: 24008591 timestamp: 1765578833462 -- pypi: https://files.pythonhosted.org/packages/65/44/bb509c3d2c0b5a87e7a5af1d5917a402a32ff026f777a6d7cb6990746cbb/tabcompleter-1.4.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/cb/fc/8c82be70b8f96d09943360f34cfb2ecdd3035294c51bce4131eeabe56645/tabcompleter-1.4.1-py3-none-any.whl name: tabcompleter - version: 1.4.0 - sha256: d744aa735b49c0a6cc2fb8fcd40077fec47425e4388301010b14e6ce3311368b + version: 1.4.1 + sha256: 26b5cf330a48f32625b00e1664aa589f67c8e98275b6d9c2b85d19917dac1601 requires_dist: - pyreadline3 ; sys_platform == 'win32' requires_python: '>=3.8' @@ -15138,19 +15311,18 @@ packages: - pkg:pypi/tabulate?source=hash-mapping size: 43964 timestamp: 1772732795746 -- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9 - md5: 0f9817ffbe25f9e69ceba5ea70c52606 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda + sha256: 8a4053839b8e997a5965e2dff7d6cf3c77be62d82c0e48c8a04a5ed2d2e73035 + md5: 8ee01a693aecff5432069eaaf1183c45 depends: - - libhwloc >=2.12.2,<2.12.3.0a0 + - libhwloc >=2.13.0,<2.13.1.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE purls: [] - size: 155869 - timestamp: 1767886839029 + size: 156515 + timestamp: 1778673901757 - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda sha256: b375e8df0d5710717c31e7c8e93c025c37fa3504aea325c7a55509f64e5d4340 md5: e43ca10d61e55d0a8ec5d8c62474ec9e @@ -15242,6 +15414,11 @@ packages: - pkg:pypi/tomli?source=hash-mapping size: 21561 timestamp: 1774492402955 +- pypi: https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl + name: tomli-w + version: 1.2.0 + sha256: 188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90 + requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py314h5bd0f2a_0.conda sha256: ed8d06093ff530a2dae9ed1e51eb6f908fbfd171e8b62f4eae782d67b420be5a md5: dc1ff1e915ab35a06b6fa61efae73ab5 @@ -15285,39 +15462,39 @@ packages: - pkg:pypi/tornado?source=hash-mapping size: 914835 timestamp: 1774358183098 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 - md5: 019a7385be9af33791c989871317e1ed +- 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 purls: - pkg:pypi/traitlets?source=hash-mapping - size: 110051 - timestamp: 1733367480074 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ty-0.0.32-h4e94fc0_0.conda + size: 115165 + timestamp: 1778074251714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ty-0.0.37-h4e94fc0_0.conda noarch: python - sha256: 5bfdb00561609b5c065a3b8cce3f95dd2c66de4cca9150d7b7819979b4ffe518 - md5: 4e3454fe01079cc508d75ba1b7fcd916 + sha256: 6c78e14e693fd071b7ac0f4caee14182a34c24eb67f71a6e8b64c5c666d47ab0 + md5: a9d531eb76731b39c6919a907ec74153 depends: - python - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - _python_abi3_support 1.* - cpython >=3.10 constrains: - __glibc >=2.17 license: MIT - license_family: MIT purls: - pkg:pypi/ty?source=hash-mapping - size: 9600067 - timestamp: 1776721452584 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ty-0.0.32-hdfcc030_0.conda + size: 9809531 + timestamp: 1778924736785 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ty-0.0.37-hdfcc030_0.conda noarch: python - sha256: df97a07d76c93cb5849b22422e05ef94e1b17b659c8cc6078d2abdf0ebeb09e7 - md5: 318569c90d67843f52be5570a88e494f + sha256: 20ec9265a68590829049db32ea4cdb8f62694fce33515962eebb21ee1b96b379 + md5: 8ba816369178d668776075e749214c38 depends: - python - __osx >=11.0 @@ -15326,15 +15503,14 @@ packages: constrains: - __osx >=11.0 license: MIT - license_family: MIT purls: - pkg:pypi/ty?source=hash-mapping - size: 8649328 - timestamp: 1776721470806 -- conda: https://conda.anaconda.org/conda-forge/win-64/ty-0.0.32-hc21aad4_0.conda + size: 8832640 + timestamp: 1778924753670 +- conda: https://conda.anaconda.org/conda-forge/win-64/ty-0.0.37-hc21aad4_0.conda noarch: python - sha256: 32ddaab3bf4a6f6a70b15ac477140f2a2f00ad016e998228e1ba0eb4745af4af - md5: a54c912498faf708aefbd1a9ae111a79 + sha256: 9c254e409ea4d419263b0b6432ad908dfb01105dca50e287523115a4b2127179 + md5: bd5d50945659ab7b1c90a49fdf14ead7 depends: - python - vc >=14.3,<15 @@ -15343,21 +15519,21 @@ packages: - _python_abi3_support 1.* - cpython >=3.10 license: MIT - license_family: MIT purls: - pkg:pypi/ty?source=hash-mapping - size: 9634314 - timestamp: 1776721486913 -- conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.1.1.20260408-pyhd8ed1ab_0.conda - sha256: f7dca54c2e9b1ec9c8a12931128a78b3a75c4b511dd2688b1f06bfe8880df3ae - md5: 792307c4c22804c7ce39900e518f0b20 + size: 9843839 + timestamp: 1778924768700 +- conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2026.2.0.20260506-pyhcf101f3_0.conda + sha256: 7c4a1234a4ce213a65574f6080b41693965d00892edce77237ea110efb98a805 + md5: 464d6104d7802b4c92c39c0a6b19370f depends: - python >=3.10 + - python license: Apache-2.0 AND MIT purls: - pkg:pypi/types-pytz?source=hash-mapping - size: 20040 - timestamp: 1775643470173 + size: 20355 + timestamp: 1778054628795 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 @@ -15494,9 +15670,9 @@ packages: - pkg:pypi/uri-template?source=hash-mapping size: 23990 timestamp: 1733323714454 -- 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 @@ -15507,48 +15683,48 @@ packages: license_family: MIT purls: - pkg:pypi/urllib3?source=hash-mapping - size: 103172 - timestamp: 1767817860341 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a - md5: 1e610f2416b6acdd231c5f573d754a0f + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_36.conda + sha256: dbcbad366e38979ac8ca9efb0ec48e5fedf9ce76f9485120c131cab7315c681c + md5: 10eac3d81ceea1be614f1d90045c7e9b depends: - - vc14_runtime >=14.44.35208 + - vc14_runtime >=14.51.36231 track_features: - vc14 license: BSD-3-Clause license_family: BSD purls: [] - size: 19356 - timestamp: 1767320221521 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 - md5: 37eb311485d2d8b2c419449582046a42 + size: 20260 + timestamp: 1779061872533 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_36.conda + sha256: e6f48954124c4f9419e50b3de7cb4b88f3a6078bf3616e997ea60144d499aa30 + md5: df9d8c15f117f28087b4aa6efa529a56 depends: - ucrt >=10.0.20348.0 - - vcomp14 14.44.35208 h818238b_34 + - vcomp14 14.51.36231 h1b9f54f_36 constrains: - - vs2015_runtime 14.44.35208.* *_34 + - vs2015_runtime 14.51.36231.* *_36 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary purls: [] - size: 683233 - timestamp: 1767320219644 -- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 - md5: 242d9f25d2ae60c76b38a5e42858e51d + size: 739707 + timestamp: 1779061867466 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_36.conda + sha256: bba3bcaf805eefd0aa14beb3d08a34a81d5d36e6890bd6ce33fcb968429a3bc7 + md5: d929e2c56341be7ae1bd9a77a9b535c2 depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.44.35208.* *_34 + - vs2015_runtime 14.51.36231.* *_36 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary purls: [] - size: 115235 - timestamp: 1767320173250 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - sha256: 9a07c52fd7fc0d187c53b527e54ea57d4f46302946fee2f9291d035f4f8984f9 - md5: 15be1b64e7a4501abb4f740c28ceadaf + size: 124124 + timestamp: 1779061850036 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda + sha256: 67a5a8b0976f11bd821909dd7ffd393ae32879ec22be622344277f04a1450aff + md5: a678237f7d0db44f8a20a21f03844613 depends: - python >=3.10 - distlib >=0.3.7,<1 @@ -15559,21 +15735,20 @@ packages: - typing_extensions >=4.13.2 - python license: MIT - license_family: MIT purls: - - pkg:pypi/virtualenv?source=compressed-mapping - size: 4659433 - timestamp: 1776247061232 -- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - sha256: 63ff4ec6e5833f768d402f5e95e03497ce211ded5b6f492e660e2bfc726ad24d - md5: f276d1de4553e8fca1dfb6988551ebb4 + - pkg:pypi/virtualenv?source=hash-mapping + size: 5154878 + timestamp: 1778710685928 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_36.conda + sha256: 720d9bbbd0cd48f80d1b295fd6eb9f2e4accade35226470db97b6f09745df149 + md5: d4e73c2ddb98e1071de99e37f4499c6c depends: - - vc14_runtime >=14.44.35208 + - vc14_runtime >=14.51.36231 license: BSD-3-Clause license_family: BSD purls: [] - size: 19347 - timestamp: 1767320221943 + size: 20247 + timestamp: 1779061872946 - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl name: wadler-lindig version: 0.1.7 @@ -15604,17 +15779,17 @@ packages: purls: [] size: 334139 timestamp: 1773959575393 -- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa - md5: c3197f8c0d5b955c904616b716aca093 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda + sha256: 1ee2d8384972ecbf8630ce8a3ea9d16858358ad3e8566675295e66996d5352da + md5: eb9538b8e55069434a18547f43b96059 depends: - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/wcwidth?source=hash-mapping - size: 71550 - timestamp: 1770634638503 + size: 82917 + timestamp: 1777744489106 - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6 md5: 6639b6b0d8b5a284f027a2003669aa65 diff --git a/pyproject.toml b/pyproject.toml index 89846aec9..4bf957a61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,8 +29,10 @@ classifiers = [ ] dynamic = [ "version" ] dependencies = [ + "beartype>=0.21", "cloudpickle>=3.1.2", - "dags>=0.5.1", + # Require the beartype fix, replace once release is there + # "dags>=0.6.0", "h5py>=3.12", "jax>=0.9", "jaxtyping>=0.3.2", @@ -98,7 +100,7 @@ tests-cuda13 = { features = [ "tests", "cuda13" ], solve-group = "cuda13" } tests-metal = { features = [ "tests", "metal" ], solve-group = "metal" } type-checking = { features = [ "type-checking", "tests" ], solve-group = "default" } [tool.pixi.feature.benchmarks.pypi-dependencies] -aca-model = { git = "https://github.com/OpenSourceEconomics/aca-model.git", rev = "b807b286175e00f8a721f039f4afd657bbb10e2f" } +aca-model = { git = "https://github.com/OpenSourceEconomics/aca-model.git", rev = "bce9101b049f4088789c19be14ab7b436daf44f7" } [tool.pixi.feature.cuda12] platforms = [ "linux-64" ] system-requirements = { cuda = "12" } @@ -148,6 +150,8 @@ ty = "ty check" jax = ">=0.9" pdbp = "*" pylcm = { path = ".", editable = true } +# Remove and comment in `dags >= 0.6.0` above once released. +dags = { git = "https://github.com/OpenSourceEconomics/dags.git", branch = "main" } [tool.pixi.tasks] asv-compare = "asv compare" asv-preview = "asv preview" diff --git a/src/lcm/__init__.py b/src/lcm/__init__.py index d6d267568..4cce08bf8 100644 --- a/src/lcm/__init__.py +++ b/src/lcm/__init__.py @@ -25,13 +25,31 @@ import jax +# Patch jaxtyping's `"..."` sentinel to survive pickling before any +# `jaxtyping`-subscripted type is created (see the module docstring). +from lcm import _jaxtyping_patch # noqa: F401 + with contextlib.suppress(ImportError): import pdbp # noqa: F401 -from lcm import shocks -from lcm._version import __version__ -from lcm.ages import AgeGrid -from lcm.grids import ( +# Register beartype's package claw before any submodule import so every +# `lcm.*` module loads with runtime type checks installed via +# `INTERNAL_CONF`. User-facing constructors stack an explicit +# `@beartype(conf=...)` decorator that maps violations to the relevant +# project exception (see `lcm._beartype_conf`). +from beartype.claw import beartype_package + +from lcm._beartype_conf import INTERNAL_CONF + +beartype_package("lcm", conf=INTERNAL_CONF) + +# Modules with TYPE_CHECKING-only forward references expose a +# `_bind_forward_refs` helper; calling it here makes the claw's +# rewritten string annotations resolve at call time. +from lcm import shocks # noqa: E402 +from lcm._version import __version__ # noqa: E402 +from lcm.ages import AgeGrid # noqa: E402 +from lcm.grids import ( # noqa: E402 DiscreteGrid, IrregSpacedGrid, LinSpacedGrid, @@ -41,19 +59,29 @@ PiecewiseLogSpacedGrid, categorical, ) -from lcm.interfaces import SolveSimulateFunctionPair -from lcm.model import Model -from lcm.persistence import ( +from lcm.interfaces import SolveSimulateFunctionPair # noqa: E402 +from lcm.model import Model # noqa: E402 +from lcm.persistence import ( # noqa: E402 SimulateSnapshot, SolveSnapshot, load_snapshot, load_solution, save_solution, ) -from lcm.regime import MarkovTransition, Regime -from lcm.simulation.result import SimulationResult -from lcm.utils.containers import invert_regime_ids -from lcm.utils.error_handling import validate_transition_probs +from lcm.persistence import ( # noqa: E402 + _bind_forward_refs as _bind_persistence_forward_refs, +) +from lcm.regime import MarkovTransition, Regime # noqa: E402 +from lcm.simulation.result import SimulationResult # noqa: E402 +from lcm.utils.containers import invert_regime_ids # noqa: E402 +from lcm.utils.error_handling import validate_transition_probs # noqa: E402 +from lcm.variables import ( # noqa: E402 + _bind_forward_refs as _bind_variables_forward_refs, +) + +_bind_variables_forward_refs(regime_cls=Regime) +_bind_persistence_forward_refs(model_cls=Model, simulation_result_cls=SimulationResult) +del _bind_persistence_forward_refs, _bind_variables_forward_refs # Register MappingProxyType as a JAX pytree so it can be used in JIT-traced functions. # This allows regime transition probabilities to use immutable mappings. diff --git a/src/lcm/_beartype_conf.py b/src/lcm/_beartype_conf.py new file mode 100644 index 000000000..440a13e36 --- /dev/null +++ b/src/lcm/_beartype_conf.py @@ -0,0 +1,69 @@ +"""`BeartypeConf` instances for pylcm's perimeter and internal claws. + +`INTERNAL_CONF` is the default conf for the `lcm` package-wide claw +registered in `lcm/__init__.py`. Violations under that claw surface as +beartype's own `BeartypeCallHintViolation`, marking them as internal +pylcm bugs rather than user error. + +The remaining confs (`MODEL_CONF`, `REGIME_CONF`, `GRID_CONF`, +`PARAMS_CONF`, `CATEGORICAL_CONF`) are used by explicit +`@beartype(conf=...)` decorators on user-facing constructors and entry +points. They map type violations to the existing project exception +class, preserving the documented exception hierarchy at the user +boundary. The decorators stack on top of the package claw and take +precedence at the call sites they cover. + +""" + +from beartype import BeartypeConf, BeartypeStrategy + +from lcm.exceptions import ( + CategoricalDefinitionError, + GridInitializationError, + InvalidParamsError, + ModelInitializationError, + RegimeInitializationError, +) + + +def _conf(exc: type[Exception]) -> BeartypeConf: + # `On` strategy: full O(n) container validation so every bad entry in a + # mapping/sequence is reported, not just one sampled element. The + # decorated entry points are called rarely (construction, solve, + # simulate), so per-call cost is invisible. + # `is_pep484_tower=True`: respect the PEP-484 numeric tower so `int` + # satisfies `float`-typed parameters (matches the implicit numeric + # conversion that Python and ruff's PYI041 both assume). + return BeartypeConf( + violation_param_type=exc, + strategy=BeartypeStrategy.On, + is_pep484_tower=True, + ) + + +# Used on `Regime` and `MarkovTransition`. +REGIME_CONF = _conf(RegimeInitializationError) + +# Used on `Model`. +MODEL_CONF = _conf(ModelInitializationError) + +# Used on all grid and shock-grid constructors. +GRID_CONF = _conf(GridInitializationError) + +# Used on the `categorical` decorator factory. +CATEGORICAL_CONF = _conf(CategoricalDefinitionError) + +# Used on `Model.solve`, `Model.simulate`, and the `as_leaf` factory. +PARAMS_CONF = _conf(InvalidParamsError) + +# Default conf for the package-wide claw on `lcm` registered in +# `lcm/__init__.py`. A type violation in any internal helper surfaces as +# beartype's own `BeartypeCallHintViolation` rather than a project +# exception. User-facing constructors layer their own +# `@beartype(conf=...)` decorators on top to map violations to project +# exceptions; those decorators take precedence at the call sites they +# cover. +INTERNAL_CONF = BeartypeConf( + strategy=BeartypeStrategy.On, + is_pep484_tower=True, +) diff --git a/src/lcm/_jaxtyping_patch.py b/src/lcm/_jaxtyping_patch.py new file mode 100644 index 000000000..e9dced877 --- /dev/null +++ b/src/lcm/_jaxtyping_patch.py @@ -0,0 +1,36 @@ +"""Make jaxtyping's anonymous-variadic-dim sentinel survive pickling. + +jaxtyping marks a `"..."` axis with a module-level `object()` sentinel +(`_anonymous_variadic_dim`). A plain `object()` does not keep its identity +across a pickle round-trip, so cloudpickling a value whose type annotations +reference a `Foo[Array, "..."]` type — which the beartype claw makes +pervasive — yields a type whose variadic-dim marker no longer matches the +live module global. jaxtyping's shape check then trips +`assert type(variadic_dim) is _NamedVariadicDim`. + +Replacing the sentinel with a `__reduce__`-backed singleton makes it +round-trip to the same object, so unpickled annotation types stay valid. +This module must be imported before any `jaxtyping`-subscripted type is +created — `lcm/__init__.py` imports it before every other `lcm` submodule. +""" + +from typing import Self + +from jaxtyping import _array_types + + +class _AnonymousVariadicDim: + """Picklable singleton for jaxtyping's `"..."` axis marker.""" + + _instance: Self | None = None + + def __new__(cls) -> Self: + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __reduce__(self) -> tuple[type[_AnonymousVariadicDim], tuple[()]]: + return (_AnonymousVariadicDim, ()) + + +_array_types._anonymous_variadic_dim = _AnonymousVariadicDim() # noqa: SLF001 diff --git a/src/lcm/ages.py b/src/lcm/ages.py index 11d2c88c7..b7736951f 100644 --- a/src/lcm/ages.py +++ b/src/lcm/ages.py @@ -8,9 +8,11 @@ from typing import overload import jax.numpy as jnp +from beartype import beartype +from lcm._beartype_conf import GRID_CONF from lcm.exceptions import GridInitializationError, format_messages -from lcm.typing import Float1D, Int1D +from lcm.typing import Float1D, Int1D, UserAge STEP_UNITS: MappingProxyType[str, Fraction] = MappingProxyType( { @@ -38,8 +40,8 @@ class AgeGrid: def __init__( self, *, - start: int | Fraction, - stop: int | Fraction, + start: UserAge, + stop: UserAge, step: str, ) -> None: ... @@ -47,16 +49,17 @@ def __init__( def __init__( self, *, - exact_values: Iterable[int | Fraction], + exact_values: Iterable[UserAge], ) -> None: ... + @beartype(conf=GRID_CONF) def __init__( self, *, - start: int | Fraction | None = None, - stop: int | Fraction | None = None, + start: UserAge | None = None, + stop: UserAge | None = None, step: str | None = None, - exact_values: Iterable[int | Fraction] | None = None, + exact_values: Iterable[UserAge] | None = None, ) -> None: _validate_age_grid(start=start, stop=stop, step=step, exact_values=exact_values) @@ -97,7 +100,7 @@ def values(self) -> Int1D | Float1D: return self._values @property - def exact_values(self) -> tuple[int | Fraction, ...]: + def exact_values(self) -> tuple[UserAge, ...]: """Exact ages; indexed by period. Could be: @@ -221,10 +224,10 @@ def _is_integer_valued(value: int | Fraction) -> bool: def _validate_age_grid( *, - start: int | Fraction | None, - stop: int | Fraction | None, + start: UserAge | None, + stop: UserAge | None, step: str | None, - exact_values: Iterable[int | Fraction] | None, + exact_values: Iterable[UserAge] | None, ) -> None: error_messages: list[str] = [] @@ -249,9 +252,7 @@ def _validate_age_grid( raise GridInitializationError(format_messages(error_messages)) -def _validate_range( - *, start: int | Fraction, stop: int | Fraction, step: str -) -> list[str]: +def _validate_range(*, start: UserAge, stop: UserAge, step: str) -> list[str]: errors: list[str] = [] if start >= stop: @@ -282,7 +283,7 @@ def _validate_range( return errors -def _validate_values(values: Iterable[int | Fraction]) -> list[str]: +def _validate_values(values: Iterable[UserAge]) -> list[str]: errors: list[str] = [] try: diff --git a/src/lcm/dtypes.py b/src/lcm/dtypes.py index f2cf31708..45e7f46a7 100644 --- a/src/lcm/dtypes.py +++ b/src/lcm/dtypes.py @@ -11,24 +11,27 @@ import jax import jax.numpy as jnp import numpy as np -from jax import Array + +from lcm.typing import FloatND, IntND _INT32_MIN = int(np.iinfo(np.int32).min) _INT32_MAX = int(np.iinfo(np.int32).max) _FLOAT32_MAX = float(np.finfo(np.float32).max) -def canonical_float_dtype() -> jnp.dtype: +def canonical_float_dtype() -> type: """Return pylcm's canonical float dtype, derived from `jax_enable_x64`. Returns `jnp.float64` if `jax.config.jax_enable_x64` is True, - otherwise `jnp.float32`. The value is read at call time, not at - import, so toggling the JAX config (e.g. between tests) is honoured. + otherwise `jnp.float32`. The return is a JAX scalar type, passable + wherever JAX/NumPy accept a dtype-like specifier. The value is read + at call time, not at import, so toggling the JAX config (e.g. + between tests) is honoured. """ return jnp.float64 if jax.config.read("jax_enable_x64") else jnp.float32 -def safe_to_int_dtype(value: object, *, name: str) -> Array: +def safe_to_int_dtype(value: object, *, name: str) -> IntND: """Cast a scalar, sequence, or array to `jnp.int32`, checking int32 range. Args: @@ -58,7 +61,7 @@ def safe_to_int_dtype(value: object, *, name: str) -> Array: return jnp.asarray(np_value, dtype=jnp.int32) -def safe_to_float_dtype(value: object, *, name: str) -> Array: +def safe_to_float_dtype(value: object, *, name: str) -> FloatND: """Cast a scalar, sequence, or array to the canonical float dtype. Range check fires only on a down-cast: diff --git a/src/lcm/grids/categorical.py b/src/lcm/grids/categorical.py index b45834424..618925b81 100644 --- a/src/lcm/grids/categorical.py +++ b/src/lcm/grids/categorical.py @@ -5,7 +5,9 @@ import jax import jax.numpy as jnp import pandas as pd +from beartype import beartype +from lcm._beartype_conf import CATEGORICAL_CONF from lcm.exceptions import ( CategoricalDefinitionError, GridInitializationError, @@ -15,6 +17,7 @@ from lcm.utils.containers import find_duplicates, get_field_names_and_values +@beartype(conf=CATEGORICAL_CONF) def categorical[T](*, ordered: bool) -> Callable[[type[T]], type[T]]: """Create a categorical class with auto-assigned `ScalarInt` values. diff --git a/src/lcm/grids/continuous.py b/src/lcm/grids/continuous.py index 9a7678eb4..0c7865d92 100644 --- a/src/lcm/grids/continuous.py +++ b/src/lcm/grids/continuous.py @@ -2,17 +2,19 @@ from abc import ABC, abstractmethod from collections.abc import Sequence from dataclasses import dataclass -from typing import overload +from typing import Any import jax.numpy as jnp -from jax import Array +from beartype import beartype +from lcm._beartype_conf import GRID_CONF from lcm.dtypes import canonical_float_dtype from lcm.exceptions import GridInitializationError, format_messages from lcm.grids import coordinates as grid_coordinates from lcm.grids.base import Grid from lcm.typing import ( Float1D, + FloatND, ScalarFloat, ScalarInt, ) @@ -32,12 +34,8 @@ class ContinuousGrid(Grid): distributed: bool = False """Whether to distribute the grid over the available devices.""" - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... @abstractmethod - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" @@ -59,6 +57,7 @@ class UniformContinuousGrid(ContinuousGrid, ABC): n_points: ScalarInt """The number of points in the grid (`jnp.int32` JAX scalar).""" + @beartype(conf=GRID_CONF) def __init__( self, *, @@ -82,12 +81,8 @@ def __init__( def to_jax(self) -> Float1D: """Convert the grid to a Jax array.""" - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... @abstractmethod - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" def replace(self, **kwargs: float) -> UniformContinuousGrid: @@ -123,11 +118,7 @@ def to_jax(self) -> Float1D: start=self.start, stop=self.stop, n_points=self.n_points ) - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" return grid_coordinates.get_linspace_coordinate( value=value, @@ -148,6 +139,7 @@ class LogSpacedGrid(UniformContinuousGrid): """ + @beartype(conf=GRID_CONF) def __init__( self, *, @@ -173,11 +165,7 @@ def to_jax(self) -> Float1D: start=self.start, stop=self.stop, n_points=self.n_points ) - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" return grid_coordinates.get_logspace_coordinate( value=value, @@ -248,6 +236,7 @@ class IrregSpacedGrid(ContinuousGrid): n_points: int """Number of points. Derived from `len(points)` when points are given.""" + @beartype(conf=GRID_CONF) def __init__( self, *, @@ -308,11 +297,7 @@ def to_jax(self) -> Float1D: ) return self.points - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" if self.points is None: raise GridInitializationError( @@ -377,9 +362,16 @@ def _validate_continuous_grid( raise GridInitializationError(msg) -def _validate_irreg_spaced_grid(points: Sequence[float] | Float1D) -> None: +def _validate_irreg_spaced_grid(points: Sequence[Any] | Float1D) -> None: """Validate the irregular spaced grid parameters. + The element type is `Any` because the function's manual loop is what + surfaces the user-facing `GridInitializationError` for non-numeric + entries; tightening to `Sequence[float]` makes beartype's package- + claw deep-check intercept first (observed flaking under cuda12 + + 32-bit precision in CI), raising raw `BeartypeCallHintViolation` + before the manual check fires. + Args: points: The grid points. diff --git a/src/lcm/grids/coordinates.py b/src/lcm/grids/coordinates.py index dc95b40c5..20e83afbf 100644 --- a/src/lcm/grids/coordinates.py +++ b/src/lcm/grids/coordinates.py @@ -1,17 +1,15 @@ """Functions to generate and work with different kinds of grids. -These helpers operate on JAX scalars (`ScalarFloat` for endpoints/values, -`ScalarInt` or Python `int` for `n_points`) — every production caller is -either a `Grid` method that has already converted user input to a JAX -scalar, or a piecewise dispatch that selects pieces via `searchsorted`. +The `get_*_coordinate` helpers take JAX arrays of any rank: a `Grid` +method passes a 0-d value, while a piecewise dispatch selects pieces via +`searchsorted` and passes `start` / `stop` / `n_points` indexed by an +N-d `piece_idx`. `linspace` / `logspace` build a grid and take JAX +scalars. """ -from typing import overload - import jax.numpy as jnp -from jax import Array -from lcm.typing import Float1D, ScalarFloat, ScalarInt +from lcm.typing import Float1D, FloatND, IntND, ScalarFloat, ScalarInt def linspace( @@ -29,29 +27,13 @@ def linspace( return jnp.linspace(start, stop, n_points) # ty: ignore[no-matching-overload] -@overload def get_linspace_coordinate( *, - value: ScalarFloat, - start: ScalarFloat, - stop: ScalarFloat, - n_points: ScalarInt, -) -> ScalarFloat: ... -@overload -def get_linspace_coordinate( - *, - value: Array, - start: ScalarFloat, - stop: ScalarFloat, - n_points: ScalarInt, -) -> Array: ... -def get_linspace_coordinate( - *, - value: ScalarFloat | Array, - start: ScalarFloat, - stop: ScalarFloat, - n_points: ScalarInt, -) -> ScalarFloat | Array: + value: FloatND, + start: FloatND, + stop: FloatND, + n_points: IntND, +) -> FloatND: """Map a value into the input needed for jax.scipy.ndimage.map_coordinates.""" step_length = (stop - start) / (n_points - 1) return (value - start) / step_length @@ -83,29 +65,13 @@ def logspace( return grid.at[0].set(start).at[-1].set(stop) -@overload def get_logspace_coordinate( *, - value: ScalarFloat, - start: ScalarFloat, - stop: ScalarFloat, - n_points: ScalarInt, -) -> ScalarFloat: ... -@overload -def get_logspace_coordinate( - *, - value: Array, - start: ScalarFloat, - stop: ScalarFloat, - n_points: ScalarInt, -) -> Array: ... -def get_logspace_coordinate( - *, - value: ScalarFloat | Array, - start: ScalarFloat, - stop: ScalarFloat, - n_points: ScalarInt, -) -> ScalarFloat | Array: + value: FloatND, + start: FloatND, + stop: FloatND, + n_points: IntND, +) -> FloatND: """Map a value into the input needed for jax.scipy.ndimage.map_coordinates.""" # Transform start, stop, and value to linear scale start_linear = jnp.log(start) @@ -143,23 +109,11 @@ def get_logspace_coordinate( return rank_lower_gridpoint + decimal_part -@overload -def get_irreg_coordinate( - *, - value: ScalarFloat, - points: Float1D, -) -> ScalarFloat: ... -@overload -def get_irreg_coordinate( - *, - value: Array, - points: Float1D, -) -> Array: ... def get_irreg_coordinate( *, - value: ScalarFloat | Array, + value: FloatND, points: Float1D, -) -> ScalarFloat | Array: +) -> FloatND: """Return the generalized coordinate of a value in an irregularly spaced grid. Uses binary search (jnp.searchsorted) to find the position of the value among diff --git a/src/lcm/grids/discrete.py b/src/lcm/grids/discrete.py index f6fa98043..0852867a0 100644 --- a/src/lcm/grids/discrete.py +++ b/src/lcm/grids/discrete.py @@ -1,5 +1,7 @@ import jax.numpy as jnp +from beartype import beartype +from lcm._beartype_conf import GRID_CONF from lcm.grids.base import Grid from lcm.grids.categorical import _validate_discrete_grid from lcm.typing import Int1D @@ -19,6 +21,7 @@ class DiscreteGrid(Grid): """ + @beartype(conf=GRID_CONF) def __init__( self, category_class: type, batch_size: int = 0, *, distributed: bool = False ) -> None: diff --git a/src/lcm/grids/piecewise.py b/src/lcm/grids/piecewise.py index 43ff2a91e..dc3abdead 100644 --- a/src/lcm/grids/piecewise.py +++ b/src/lcm/grids/piecewise.py @@ -1,16 +1,17 @@ import dataclasses from dataclasses import dataclass -from typing import overload import jax.numpy as jnp import portion -from jax import Array +from beartype import beartype +from lcm._beartype_conf import GRID_CONF from lcm.exceptions import GridInitializationError, format_messages from lcm.grids import coordinates as grid_coordinates from lcm.grids.continuous import ContinuousGrid from lcm.typing import ( Float1D, + FloatND, Int1D, ScalarFloat, ScalarInt, @@ -34,6 +35,7 @@ class Piece: n_points: ScalarInt """The number of grid points in this piece (`jnp.int32` JAX scalar).""" + @beartype(conf=GRID_CONF) def __init__( self, *, @@ -44,6 +46,7 @@ def __init__( object.__setattr__(self, "n_points", jnp.int32(n_points)) +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class PiecewiseLinSpacedGrid(ContinuousGrid): """A piecewise linearly spaced grid with multiple segments. @@ -85,7 +88,7 @@ def __post_init__(self) -> None: @property def n_points(self) -> ScalarInt: """Return the total number of points in the grid.""" - return self._piece_n_points.sum() + return self._piece_n_points.sum(dtype=jnp.int32) def to_jax(self) -> Float1D: """Convert the grid to a Jax array.""" @@ -95,11 +98,7 @@ def to_jax(self) -> Float1D: ] return jnp.concatenate(piece_arrays) - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" piece_idx = jnp.searchsorted(self._breakpoints, value, side="right") local_coord = grid_coordinates.get_linspace_coordinate( @@ -111,6 +110,7 @@ def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: return self._cumulative_offsets[piece_idx] + local_coord +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class PiecewiseLogSpacedGrid(ContinuousGrid): """A piecewise logarithmically spaced grid with multiple segments. @@ -152,7 +152,7 @@ def __post_init__(self) -> None: @property def n_points(self) -> ScalarInt: """Return the total number of points in the grid.""" - return self._piece_n_points.sum() + return self._piece_n_points.sum(dtype=jnp.int32) def to_jax(self) -> Float1D: """Convert the grid to a Jax array.""" @@ -166,11 +166,7 @@ def to_jax(self) -> Float1D: ] return jnp.concatenate(piece_arrays) - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" piece_idx = jnp.searchsorted(self._breakpoints, value, side="right") local_coord = grid_coordinates.get_logspace_coordinate( @@ -236,8 +232,10 @@ def _init_piecewise_grid_cache( # Breakpoints are the effective starts of pieces 1..k-1 breakpoints = starts[1:] if len(starts) > 1 else jnp.array([]) - n_points = jnp.array([p.n_points for p in grid.pieces]) - cumulative = jnp.concatenate([jnp.array([0]), jnp.cumsum(n_points[:-1])]) + n_points = jnp.array([p.n_points for p in grid.pieces], dtype=jnp.int32) + cumulative = jnp.concatenate( + [jnp.array([0], dtype=jnp.int32), jnp.cumsum(n_points[:-1])] + ) object.__setattr__(grid, "_breakpoints", breakpoints) object.__setattr__(grid, "_piece_starts", starts) diff --git a/src/lcm/interfaces.py b/src/lcm/interfaces.py index d4288f4f7..dbb2e0745 100644 --- a/src/lcm/interfaces.py +++ b/src/lcm/interfaces.py @@ -19,11 +19,17 @@ DiscreteAction, DiscreteState, FlatRegimeParams, + Float1D, + FloatND, FunctionsMapping, + IntND, MaxQOverAFunction, NextStateSimulationFunction, + RegimeName, RegimeParamsTemplate, RegimeTransitionFunction, + ScalarFloat, + ScalarInt, StateName, StateOrActionName, TransitionFunctionName, @@ -214,7 +220,7 @@ class SimulateFunctions: class InternalRegime: """Internal representation of a user regime.""" - name: str + name: RegimeName """Regime name (key in the regimes dict).""" terminal: bool @@ -273,10 +279,13 @@ def state_action_space(self, regime_params: FlatRegimeParams) -> StateActionSpac points_key = f"{name}__points" if points_key not in all_params: continue + # Runtime grid-point params are flat JAX arrays — never a + # `MappingLeaf` / `SequenceLeaf` — so narrow via `cast`. + points = cast("Array", all_params[points_key]) if in_states: - state_replacements[name] = all_params[points_key] + state_replacements[name] = points else: - action_replacements[name] = all_params[points_key] + action_replacements[name] = points # `_ShockGrid` is state-only by construction (intrinsic # transitions, forbidden as actions per AGENTS.md). The # `in_states` gate makes that invariant explicit — a @@ -292,9 +301,13 @@ def state_action_space(self, regime_params: FlatRegimeParams) -> StateActionSpac ) if not all_present: continue - shock_kw: dict[str, float] = dict(spec.params) + shock_kw: dict[str, ScalarFloat | ScalarInt] = dict(spec.params) for p in spec.params_to_pass_at_runtime: - shock_kw[p] = cast("float", all_params[f"{name}__{p}"]) + # Runtime shock-grid params are flat JAX scalars — never + # a `MappingLeaf` / `SequenceLeaf` — so narrow via `cast`. + shock_kw[p] = cast( + "ScalarFloat | ScalarInt", all_params[f"{name}__{p}"] + ) state_replacements[name] = spec.compute_gridpoints(**shock_kw) new_states = ( @@ -417,9 +430,9 @@ def _build_regime_sharding( def _distribute_states_to_devices( *, - states: MappingProxyType[StateName, Array], + states: MappingProxyType[StateName, FloatND | IntND], grids: MappingProxyType[StateOrActionName, Grid], -) -> MappingProxyType[StateName, Array]: +) -> MappingProxyType[StateName, FloatND | IntND]: """Place each distributed state's array on its device mesh. States whose grid carries `distributed=True` are placed via @@ -451,13 +464,13 @@ def _distribute_states_to_devices( class PeriodRegimeSimulationData: """Raw simulation data for one period in one regime.""" - V_arr: Array + V_arr: Float1D """Value function array for all subjects at this period.""" - actions: MappingProxyType[ActionName, Array] + actions: MappingProxyType[ActionName, FloatND | IntND] """Immutable mapping of action names to optimal action arrays for all subjects.""" - states: MappingProxyType[StateName, Array] + states: MappingProxyType[StateName, FloatND | IntND] """Immutable mapping of state names to state value arrays for all subjects.""" in_regime: Bool1D diff --git a/src/lcm/model.py b/src/lcm/model.py index 01b76e01f..1b5de6dfa 100644 --- a/src/lcm/model.py +++ b/src/lcm/model.py @@ -8,8 +8,9 @@ from types import MappingProxyType import pandas as pd -from jax import Array +from beartype import beartype +from lcm._beartype_conf import MODEL_CONF, PARAMS_CONF from lcm.ages import AgeGrid from lcm.exceptions import InvalidValueFunctionError, ModelInitializationError from lcm.grids import DiscreteGrid @@ -34,18 +35,22 @@ from lcm.regime import Regime from lcm.regime_building.processing import InternalRegime from lcm.simulation.compile import compile_all_simulate_functions -from lcm.simulation.initial_conditions import validate_initial_conditions +from lcm.simulation.initial_conditions import ( + canonicalize_initial_conditions, + validate_initial_conditions, +) from lcm.simulation.result import SimulationResult, get_simulation_output_dtypes from lcm.simulation.simulate import simulate from lcm.solution.solve_brute import solve from lcm.typing import ( - FloatND, FunctionName, InternalParams, ParamsTemplate, + PeriodToRegimeToVArr, RegimeName, RegimeNamesToIds, UserFacingParamsTemplate, + UserInitialConditions, UserParams, ) from lcm.utils.containers import ( @@ -128,6 +133,7 @@ class Model: simulate() calls don't serialise on logging I/O. """ + @beartype(conf=MODEL_CONF) def __init__( self, *, @@ -239,6 +245,7 @@ def get_params_template(self) -> UserFacingParamsTemplate: for regime, funcs in mutable.items() } + @beartype(conf=PARAMS_CONF) def solve( self, *, @@ -247,7 +254,7 @@ def solve( log_level: LogLevel = "progress", log_path: str | Path | None = None, log_keep_n_latest: int = 3, - ) -> MappingProxyType[int, MappingProxyType[RegimeName, FloatND]]: + ) -> PeriodToRegimeToVArr: """Solve the model using the pre-computed functions. Args: @@ -301,7 +308,7 @@ def _solve_compiled( log_path: str | Path | None, log_keep_n_latest: int, max_compilation_workers: int | None, - ) -> MappingProxyType[int, MappingProxyType[RegimeName, FloatND]]: + ) -> PeriodToRegimeToVArr: """Run backward induction, persisting a snapshot on debug or NaN failure.""" try: period_to_regime_to_V_arr = solve( @@ -368,15 +375,13 @@ def _resolve_simulate_internal_regimes( with self._simulate_compile_lock: return self._simulate_compile_cache[self.n_subjects] + @beartype(conf=PARAMS_CONF) def simulate( self, *, params: UserParams, - initial_conditions: Mapping[str, Array], - period_to_regime_to_V_arr: MappingProxyType[ - int, MappingProxyType[RegimeName, FloatND] - ] - | None, + initial_conditions: UserInitialConditions | pd.DataFrame, + period_to_regime_to_V_arr: PeriodToRegimeToVArr | None, check_initial_conditions: bool = True, seed: int | None = None, log_level: LogLevel = "progress", @@ -401,11 +406,12 @@ def simulate( specification Values may be `pd.Series` with labeled indices; they are auto-converted to JAX arrays. - initial_conditions: Mapping of state names (plus `"regime"`) to arrays. + initial_conditions: Mapping of state names (plus `"regime_id"`) to arrays. All arrays must have the same length (number of subjects). The - `"regime"` entry must contain integer regime codes (from + `"regime_id"` entry must contain integer regime codes (from `model.regime_names_to_ids`). May also be a `pd.DataFrame` - with a `"regime"` column (auto-converted). + with a `"regime_name"` column carrying regime label strings + (auto-converted via `initial_conditions_from_dataframe`). period_to_regime_to_V_arr: Value function arrays from `solve()`. When `None`, the model is solved automatically before simulating. check_initial_conditions: Whether to validate initial conditions. @@ -433,6 +439,10 @@ def simulate( regimes=self.regimes, regime_names_to_ids=self.regime_names_to_ids, ) + initial_conditions = canonicalize_initial_conditions( + initial_conditions=initial_conditions, + internal_regimes=self.internal_regimes, + ) internal_params = self._process_params(params) if check_initial_conditions: validate_initial_conditions( diff --git a/src/lcm/model_processing.py b/src/lcm/model_processing.py index 4f149736a..6df0fb5f9 100644 --- a/src/lcm/model_processing.py +++ b/src/lcm/model_processing.py @@ -151,20 +151,19 @@ def validate_model_inputs( regime_id_class: type, n_subjects: int | None = None, ) -> None: - """Validate model constructor inputs.""" - _fail_if_invalid_n_subjects(n_subjects=n_subjects) + """Validate model constructor inputs. - # Early exit if regimes are not lcm.Regime instances - if not all(isinstance(regime, Regime) for regime in regimes.values()): - raise ModelInitializationError( - "All items in regimes must be instances of lcm.Regime." - ) + `n_periods` is derived from `Model.__init__`'s `ages: AgeGrid` and + `regimes` is typed via beartype on `Model.__init__`; both reach this + function with their declared types. This function focuses on value and + cross-field rules. + + """ + _fail_if_invalid_n_subjects(n_subjects=n_subjects) error_messages: list[str] = [] - if not isinstance(n_periods, int): - error_messages.append("n_periods must be an integer.") - elif n_periods <= 1: + if n_periods <= 1: error_messages.append("n_periods must be at least 2.") if not regimes: diff --git a/src/lcm/pandas_utils.py b/src/lcm/pandas_utils.py index 68f8ad25e..044087547 100644 --- a/src/lcm/pandas_utils.py +++ b/src/lcm/pandas_utils.py @@ -3,24 +3,26 @@ from collections.abc import Callable, Mapping from dataclasses import dataclass from types import MappingProxyType -from typing import cast +from typing import Literal, cast import jax.numpy as jnp import numpy as np import pandas as pd from dags.tree import qname_from_tree_path, tree_path_from_qname -from jax import Array from lcm.ages import PSEUDO_STATE_NAMES, AgeGrid from lcm.dtypes import canonical_float_dtype from lcm.grids import DiscreteGrid, IrregSpacedGrid -from lcm.params import MappingLeaf -from lcm.params.sequence_leaf import SequenceLeaf +from lcm.params import UserMappingLeaf, UserSequenceLeaf from lcm.regime import Regime from lcm.shocks import _ShockGrid from lcm.simulation.initial_conditions import MISSING_CAT_CODE from lcm.typing import ( + Float1D, + FloatND, FunctionName, + InitialConditions, + Int1D, InternalParams, RegimeName, RegimeNamesToIds, @@ -38,9 +40,11 @@ def has_series(params: Mapping) -> bool: return True if isinstance(value, Mapping) and has_series(value): return True - if isinstance(value, (MappingLeaf, SequenceLeaf)): + if isinstance(value, (UserMappingLeaf, UserSequenceLeaf)): items = ( - value.data.values() if isinstance(value, MappingLeaf) else value.data + value.data.values() + if isinstance(value, UserMappingLeaf) + else value.data ) if any(isinstance(v, pd.Series) for v in items): return True @@ -52,28 +56,30 @@ def initial_conditions_from_dataframe( # noqa: C901 df: pd.DataFrame, regimes: Mapping[RegimeName, Regime], regime_names_to_ids: RegimeNamesToIds, -) -> dict[str, Array]: +) -> InitialConditions: """Convert a DataFrame of initial conditions to LCM initial conditions format. Args: - df: DataFrame with columns for states and a "regime" column. + df: DataFrame with columns for states and a "regime_name" column + carrying the regime label strings. regimes: Mapping of regime names to user Regime instances. regime_names_to_ids: Immutable mapping from regime names to integer indices. Returns: - Dict mapping state names (plus `"regime"`) to JAX arrays. The - `"regime"` entry contains integer codes derived from the `"regime"` - column via `regime_names_to_ids`. + Immutable mapping of state names (plus `"regime_id"`) to JAX + arrays. The `"regime_id"` entry contains integer codes derived + from the `"regime_name"` column via `regime_names_to_ids`. Raises: - ValueError: If the DataFrame is empty, the "regime" column is missing, - contains invalid regime names, has unknown columns, is missing required - states, or categorical columns contain invalid labels. + ValueError: If the DataFrame is empty, the "regime_name" column is + missing, contains invalid regime names, has unknown columns, is + missing required states, or categorical columns contain invalid + labels. """ - if "regime" not in df.columns: - msg = "DataFrame must contain a 'regime' column." + if "regime_name" not in df.columns: + msg = "DataFrame must contain a 'regime_name' column." raise ValueError(msg) if len(df) == 0: @@ -82,23 +88,24 @@ def initial_conditions_from_dataframe( # noqa: C901 # Validate regime names valid_regimes = set(regime_names_to_ids.keys()) - invalid_regimes = set(df["regime"]) - valid_regimes + invalid_regimes = set(df["regime_name"]) - valid_regimes if invalid_regimes: msg = ( - f"Invalid regime names in 'regime' column: {sorted(invalid_regimes)}. " + f"Invalid regime names in 'regime_name' column: " + f"{sorted(invalid_regimes)}. " f"Valid regimes: {sorted(valid_regimes)}." ) raise ValueError(msg) - state_columns = {col for col in df.columns if col != "regime"} + state_columns = {col for col in df.columns if col != "regime_name"} _validate_state_columns( state_columns=state_columns, regimes=regimes, - initial_regimes=df["regime"].tolist(), + initial_regimes=df["regime_name"].tolist(), ) n_subjects = len(df) - state_cols = [col for col in df.columns if col != "regime"] + state_cols = [col for col in df.columns if col != "regime_name"] # Pre-allocate result arrays (NaN default surfaces bugs for missing states) result_arrays: dict[str, np.ndarray] = { @@ -107,7 +114,7 @@ def initial_conditions_from_dataframe( # noqa: C901 discrete_state_names: set[StateName] = set() # Process per regime group (vectorised .map() within each group) - for regime_name, group in df.groupby("regime"): + for regime_name, group in df.groupby("regime_name"): regime = regimes[str(regime_name)] idx = group.index discrete_grids = { @@ -147,18 +154,18 @@ def initial_conditions_from_dataframe( # noqa: C901 nan_mask = np.isnan(result_arrays[col]) result_arrays[col][nan_mask] = MISSING_CAT_CODE - initial_conditions: dict[str, Array] = { + initial_conditions: dict[StateName | Literal["regime_id"], Float1D | Int1D] = { col: jnp.array(arr, dtype=jnp.int32) if col in discrete_state_names else jnp.array(arr, dtype=canonical_float_dtype()) for col, arr in result_arrays.items() } - initial_conditions["regime"] = jnp.array( - df["regime"].map(dict(regime_names_to_ids)).to_numpy(), + initial_conditions["regime_id"] = jnp.array( + df["regime_name"].map(dict(regime_names_to_ids)).to_numpy(), dtype=jnp.int32, ) - return initial_conditions + return MappingProxyType(initial_conditions) def _map_discrete_labels( @@ -196,7 +203,8 @@ def convert_series_in_params( Iterate over the template-shaped `internal_params` (produced by `process_params`) and convert any `pd.Series` leaf values via - `array_from_series`. `MappingLeaf` and `SequenceLeaf` values are + `array_from_series`. `UserMappingLeaf` and `UserSequenceLeaf` values + (and their canonical `MappingLeaf` / `SequenceLeaf` subclasses) are traversed and any Series inside are converted. Other values (scalars, existing arrays) pass through unchanged. @@ -279,7 +287,8 @@ def _convert_param_value( """Convert a single param value, dispatching on type. Args: - value: The parameter value (Series, MappingLeaf, or passthrough). + value: The parameter value (Series, `UserMappingLeaf` / + `UserSequenceLeaf`, or passthrough). func: The function that uses this parameter (`None` for runtime grid params — triggers scalar passthrough). param_name: Parameter name in the function. @@ -291,8 +300,9 @@ def _convert_param_value( regime_name: Regime name for action grid lookup. Returns: - Converted value: JAX array for Series, MappingLeaf with converted - Series entries, or the original value unchanged. + Converted value: JAX array for Series, a `UserMappingLeaf` / + `UserSequenceLeaf` with converted Series entries, or the original + value unchanged. """ @@ -319,10 +329,13 @@ def _recurse(inner_value: object) -> object: regime_names_to_ids=regime_names_to_ids, regime_name=regime_name, ) - if isinstance(value, MappingLeaf): - return MappingLeaf({k: _recurse(v) for k, v in value.data.items()}) - if isinstance(value, SequenceLeaf): - return SequenceLeaf(tuple(_recurse(v) for v in value.data)) + # `convert_series_in_params` runs between broadcast and canonicalization, + # so leaves are still in user form. Preserve that user form on output: + # canonicalization happens downstream in `cast_params_to_canonical_dtypes`. + if isinstance(value, UserMappingLeaf): + return UserMappingLeaf({k: _recurse(v) for k, v in value.data.items()}) + if isinstance(value, UserSequenceLeaf): + return UserSequenceLeaf(tuple(_recurse(v) for v in value.data)) return value @@ -336,7 +349,7 @@ def array_from_series( regimes: Mapping[RegimeName, Regime], regime_names_to_ids: RegimeNamesToIds, regime_name: RegimeName | None = None, -) -> Array: +) -> FloatND: """Convert a pandas Series to a JAX array. Inspect `func` to determine indexing dimensions (states, actions, @@ -683,7 +696,7 @@ def _scatter_series( series: pd.Series, level_mappings: tuple[_LevelMapping, ...], fill_value: float = np.nan, -) -> Array: +) -> FloatND: """Scatter a MultiIndex Series into an N-dimensional JAX array. Each `_LevelMapping` defines one axis: its size, and how to map labels from diff --git a/src/lcm/params/__init__.py b/src/lcm/params/__init__.py index 9eba7e8f4..0705dde3f 100644 --- a/src/lcm/params/__init__.py +++ b/src/lcm/params/__init__.py @@ -1,24 +1,37 @@ from collections.abc import Mapping, Sequence from typing import Any, overload -from lcm.params.mapping_leaf import MappingLeaf -from lcm.params.sequence_leaf import SequenceLeaf +from beartype import beartype + +from lcm._beartype_conf import PARAMS_CONF +from lcm.params.mapping_leaf import MappingLeaf, UserMappingLeaf +from lcm.params.sequence_leaf import SequenceLeaf, UserSequenceLeaf @overload -def as_leaf(data: Mapping[str, Any]) -> MappingLeaf: ... +def as_leaf(data: Mapping[str, Any]) -> UserMappingLeaf: ... @overload -def as_leaf(data: Sequence[Any]) -> SequenceLeaf: ... +def as_leaf(data: Sequence[Any]) -> UserSequenceLeaf: ... + + +@beartype(conf=PARAMS_CONF) +def as_leaf( + data: Mapping[str, Any] | Sequence[Any], +) -> UserMappingLeaf | UserSequenceLeaf: + """Wrap a Mapping or Sequence as a JAX-pytree leaf. + Returns the boundary (`User...Leaf`) variant — accepts Python scalars, + numpy arrays, `pd.Series`, JAX arrays, and nested leaves. The + canonical narrowed variants (`MappingLeaf` / `SequenceLeaf`) are the + output of `cast_params_to_canonical_dtypes`. -def as_leaf(data: Mapping[str, Any] | Sequence[Any]) -> MappingLeaf | SequenceLeaf: - """Wrap a Mapping or Sequence as a JAX-pytree leaf.""" + """ if isinstance(data, Mapping): - return MappingLeaf(dict(data)) + return UserMappingLeaf(dict(data)) if isinstance(data, Sequence): - return SequenceLeaf(data) + return UserSequenceLeaf(data) msg = f"as_leaf() expects a Mapping or Sequence, got {type(data).__name__}" raise TypeError(msg) @@ -32,4 +45,11 @@ def __getattr__(name: str) -> object: raise AttributeError(msg) -__all__ = ["MappingLeaf", "SequenceLeaf", "as_leaf", "process_params"] +__all__ = [ + "MappingLeaf", + "SequenceLeaf", + "UserMappingLeaf", + "UserSequenceLeaf", + "as_leaf", + "process_params", +] diff --git a/src/lcm/params/mapping_leaf.py b/src/lcm/params/mapping_leaf.py index 617c1e2f0..fc68be584 100644 --- a/src/lcm/params/mapping_leaf.py +++ b/src/lcm/params/mapping_leaf.py @@ -1,22 +1,40 @@ """A Mapping wrapper that is a JAX pytree but not itself a Mapping.""" -from collections.abc import Mapping -from typing import Any +from collections.abc import Mapping, Sequence +from typing import TYPE_CHECKING, Any import jax +if TYPE_CHECKING: + from lcm.typing import _ParamsLeaf, _UserParamsLeaf -class MappingLeaf: + +class UserMappingLeaf: """A Mapping wrapper that is a JAX pytree but not itself a Mapping. - Prevents flatten_regime_namespace from recursing into contents while - allowing JAX to trace through array values. + Holds the boundary leaf type — accepts the same wide value union as + `Model.solve` / `Model.simulate` parameters (Python scalars, numpy + arrays, `pd.Series`, JAX arrays, nested `UserMappingLeaf` / + `UserSequenceLeaf`). + + Prevents `flatten_regime_namespace` from recursing into contents while + allowing JAX to trace through array values. The `data` attribute is + deep-converted to immutable containers (`MappingProxyType`, `tuple`, + `frozenset`) on construction; instances themselves are not hashable + (`__hash__ = None`), since `MappingProxyType` isn't. + + The constructor accepts `Mapping[str, Any]` at runtime so beartype's + O(n) per-leaf check doesn't fire on user-supplied scalars or arrays; + the precise leaf-type contract is enforced statically through the + `data` class-attribute annotation. - Data is frozen to immutable containers on construction. """ __slots__ = ("data",) + if TYPE_CHECKING: + data: Mapping[str, _UserParamsLeaf] + def __init__(self, data: Mapping[str, Any]) -> None: from lcm.utils.containers import ( # noqa: PLC0415 ensure_containers_are_immutable, @@ -25,24 +43,51 @@ def __init__(self, data: Mapping[str, Any]) -> None: self.data = ensure_containers_are_immutable(data) def __repr__(self) -> str: - return f"MappingLeaf({dict(self.data)!r})" + return f"{type(self).__name__}({dict(self.data)!r})" __hash__ = None # MappingProxyType is not hashable def __eq__(self, other: object) -> bool: - if not isinstance(other, MappingLeaf): + if not isinstance(other, UserMappingLeaf): return NotImplemented return self.data == other.data -def _flatten(nmp: MappingLeaf) -> tuple[list[Any], tuple[str, ...]]: - keys = tuple(sorted(nmp.data.keys())) - values = [nmp.data[k] for k in keys] +class MappingLeaf(UserMappingLeaf): + """Mapping leaf carrying only canonical-dtype values. + + Output of `cast_params_to_canonical_dtypes`. Every value is either a + canonical JAX array (`FloatND` / `IntND` / `BoolND`) or another + canonical leaf (`MappingLeaf` / `SequenceLeaf`). + + Subclasses `UserMappingLeaf`, so any code that accepts the wide user + form via `isinstance(_, UserMappingLeaf)` also accepts the canonical + form. Code requiring canonical values uses the narrower `MappingLeaf` + type explicitly. + + """ + + __slots__ = () + + if TYPE_CHECKING: + data: Mapping[str, _ParamsLeaf] + + +def _user_flatten( + leaf: UserMappingLeaf, +) -> tuple[list[Any], tuple[str, ...]]: + keys = tuple(sorted(leaf.data.keys())) + values = [leaf.data[k] for k in keys] return values, keys -def _unflatten(keys: tuple[str, ...], values: list[Any]) -> MappingLeaf: +def _user_unflatten(keys: tuple[str, ...], values: Sequence[Any]) -> UserMappingLeaf: + return UserMappingLeaf(dict(zip(keys, values, strict=True))) + + +def _canonical_unflatten(keys: tuple[str, ...], values: Sequence[Any]) -> MappingLeaf: return MappingLeaf(dict(zip(keys, values, strict=True))) -jax.tree_util.register_pytree_node(MappingLeaf, _flatten, _unflatten) +jax.tree_util.register_pytree_node(UserMappingLeaf, _user_flatten, _user_unflatten) +jax.tree_util.register_pytree_node(MappingLeaf, _user_flatten, _canonical_unflatten) diff --git a/src/lcm/params/processing.py b/src/lcm/params/processing.py index d6afbccd6..5b36e091d 100644 --- a/src/lcm/params/processing.py +++ b/src/lcm/params/processing.py @@ -9,7 +9,9 @@ range values surface as `ValueError`. - Python `float` and typed float arrays cast to `canonical_float_dtype()`. Down-cast overflow surfaces as `OverflowError`. -- `MappingLeaf` / `SequenceLeaf` containers recurse. +- `UserMappingLeaf` / `UserSequenceLeaf` containers (covering both the + user-input variant and the canonical narrow variant) recurse, always + emitting a canonical `MappingLeaf` / `SequenceLeaf`. The pass runs as the *last* step over `internal_params` — `pd.Series` leaves are reshaped to JAX arrays via `convert_series_in_params` @@ -34,8 +36,8 @@ from lcm.dtypes import safe_to_float_dtype, safe_to_int_dtype from lcm.exceptions import InvalidNameError, InvalidParamsError from lcm.interfaces import InternalRegime -from lcm.params.mapping_leaf import MappingLeaf -from lcm.params.sequence_leaf import SequenceLeaf +from lcm.params.mapping_leaf import MappingLeaf, UserMappingLeaf +from lcm.params.sequence_leaf import SequenceLeaf, UserSequenceLeaf from lcm.typing import ( InternalParams, ParamsTemplate, @@ -64,8 +66,9 @@ def process_params( The output always matches the params_template skeleton. Every numeric leaf — Python `bool` / `int` / `float`, typed JAX or numpy arrays, and - numerics inside `MappingLeaf` / `SequenceLeaf` — is cast to the - canonical pylcm dtype so the AOT signature is stable across calls. + numerics inside `UserMappingLeaf` / `UserSequenceLeaf` (or their + canonical narrow subclasses) — is cast to the canonical pylcm dtype + so the AOT signature is stable across calls. Callers that pass `pd.Series` leaves should orchestrate the steps themselves: `broadcast_to_template` (resolve), `convert_series_in_params` @@ -205,7 +208,9 @@ def _cast_leaves_to_canonical_dtype(value: Any, *, name: str) -> Any: # noqa: A Casts: - - `MappingLeaf` / `SequenceLeaf`: recurse on contents. + - `UserMappingLeaf` / `UserSequenceLeaf` (covers both wide user and + canonical narrow variants): recurse on contents, always emit the + canonical `MappingLeaf` / `SequenceLeaf`. - Python `bool`: `jnp.bool_(value)` (must come before `int` — `True` is a Python `int` subclass). - Python `int`: `safe_to_int_dtype(value)` → `jnp.int32`. @@ -224,14 +229,16 @@ def _cast_leaves_to_canonical_dtype(value: Any, *, name: str) -> Any: # noqa: A - Anything else (`str`, `None`, `dict`, lists, custom objects). """ - if isinstance(value, MappingLeaf): + # `UserMappingLeaf` covers both user (wide) and canonical (`MappingLeaf`) + # variants — recursing always emits a canonical `MappingLeaf`. + if isinstance(value, UserMappingLeaf): return MappingLeaf( { k: _cast_leaves_to_canonical_dtype(v, name=f"{name}.{k}") for k, v in value.data.items() } ) - if isinstance(value, SequenceLeaf): + if isinstance(value, UserSequenceLeaf): return SequenceLeaf( [ _cast_leaves_to_canonical_dtype(v, name=f"{name}[{i}]") @@ -268,7 +275,7 @@ def _cast_leaves_to_canonical_dtype(value: Any, *, name: str) -> Any: # noqa: A msg = ( f"{name!r}: unsupported leaf type {type(value).__name__} " f"(expected bool / int / float / numpy or JAX array / " - f"MappingLeaf / SequenceLeaf)." + f"UserMappingLeaf / UserSequenceLeaf)." ) raise InvalidParamsError(msg) @@ -306,7 +313,8 @@ def create_params_template( # noqa: C901 are disjoint sets to enable unambiguous parameter propagation. Args: - internal_regimes: Mapping of regime names to InternalRegime instances. + internal_regimes: Immutable mapping of regime names to InternalRegime + instances. Returns: The parameter template. diff --git a/src/lcm/params/sequence_leaf.py b/src/lcm/params/sequence_leaf.py index 363eb963e..8176331f3 100644 --- a/src/lcm/params/sequence_leaf.py +++ b/src/lcm/params/sequence_leaf.py @@ -1,45 +1,86 @@ """A Sequence wrapper that is a JAX pytree but not itself a Sequence.""" from collections.abc import Sequence -from typing import Any +from typing import TYPE_CHECKING, Any import jax +if TYPE_CHECKING: + from lcm.typing import _ParamsLeaf, _UserParamsLeaf -class SequenceLeaf: + +class UserSequenceLeaf: """A Sequence wrapper that is a JAX pytree but not itself a Sequence. - Prevents flatten_regime_namespace from recursing into contents while - allowing JAX to trace through array values. + Holds the boundary leaf type — accepts the same wide value union as + `Model.solve` / `Model.simulate` parameters (Python scalars, numpy + arrays, `pd.Series`, JAX arrays, nested `UserMappingLeaf` / + `UserSequenceLeaf`). + + Prevents `flatten_regime_namespace` from recursing into contents while + allowing JAX to trace through array values. Data is frozen to + immutable containers on construction. + + The constructor accepts `Sequence[Any]` at runtime so beartype's + O(n) per-leaf check doesn't fire on user-supplied scalars or arrays; + the precise leaf-type contract is enforced statically through the + `data` class-attribute annotation. - Data is frozen to immutable containers on construction. """ __slots__ = ("data",) + if TYPE_CHECKING: + data: tuple[_UserParamsLeaf, ...] + def __init__(self, data: Sequence[Any]) -> None: from lcm.utils.containers import _make_immutable # noqa: PLC0415 self.data = tuple(_make_immutable(v) for v in data) def __repr__(self) -> str: - return f"SequenceLeaf({list(self.data)!r})" + return f"{type(self).__name__}({list(self.data)!r})" def __hash__(self) -> int: return hash(self.data) def __eq__(self, other: object) -> bool: - if not isinstance(other, SequenceLeaf): + if not isinstance(other, UserSequenceLeaf): return NotImplemented return self.data == other.data -def _flatten(sl: SequenceLeaf) -> tuple[list[Any], None]: - return list(sl.data), None +class SequenceLeaf(UserSequenceLeaf): + """Sequence leaf carrying only canonical-dtype values. + + Output of `cast_params_to_canonical_dtypes`. Every value is either a + canonical JAX array (`FloatND` / `IntND` / `BoolND`) or another + canonical leaf (`MappingLeaf` / `SequenceLeaf`). + + Subclasses `UserSequenceLeaf`, so any code that accepts the wide user + form via `isinstance(_, UserSequenceLeaf)` also accepts the canonical + form. Code requiring canonical values uses the narrower `SequenceLeaf` + type explicitly. + + """ + + __slots__ = () + + if TYPE_CHECKING: + data: tuple[_ParamsLeaf, ...] + + +def _user_flatten(leaf: UserSequenceLeaf) -> tuple[list[Any], None]: + return list(leaf.data), None + + +def _user_unflatten(_aux: None, values: Sequence[Any]) -> UserSequenceLeaf: + return UserSequenceLeaf(values) -def _unflatten(_aux: None, values: list[Any]) -> SequenceLeaf: +def _canonical_unflatten(_aux: None, values: Sequence[Any]) -> SequenceLeaf: return SequenceLeaf(values) -jax.tree_util.register_pytree_node(SequenceLeaf, _flatten, _unflatten) +jax.tree_util.register_pytree_node(UserSequenceLeaf, _user_flatten, _user_unflatten) +jax.tree_util.register_pytree_node(SequenceLeaf, _user_flatten, _canonical_unflatten) diff --git a/src/lcm/persistence.py b/src/lcm/persistence.py index c8498a199..e0cefdc6d 100644 --- a/src/lcm/persistence.py +++ b/src/lcm/persistence.py @@ -9,7 +9,7 @@ import shutil import tempfile import textwrap -from collections.abc import Mapping, Sequence +from collections.abc import Sequence from dataclasses import dataclass from pathlib import Path from types import MappingProxyType @@ -19,14 +19,50 @@ import h5py import jax.numpy as jnp import numpy as np -from jax import Array -from lcm.typing import FloatND, PeriodToRegimeToVArr, RegimeName, UserParams +from lcm.typing import ( + FloatND, + InitialConditions, + PeriodToRegimeToVArr, + RegimeName, + UserParams, +) if TYPE_CHECKING: from lcm.model import Model from lcm.simulation.result import SimulationResult + # Type-checker view: full precision. + _ModelOrNone = Model | None + _SimulationResultOrNone = SimulationResult | None +else: + # Runtime view used by beartype's annotation evaluator. `Model` and + # `SimulationResult` cannot be imported here (circular), so collapse + # to `Any`. The snapshot dataclasses are serialization carriers; the + # API surface that needs strict checking is the `save_*_snapshot` + # callers, which beartype still polices via their own parameters. + _ModelOrNone = Any + _SimulationResultOrNone = Any + + +def _bind_forward_refs( + *, + model_cls: type, + simulation_result_cls: type, +) -> None: + """Bind `Model` and `SimulationResult` into this module's globals. + + The package claw rewrites string annotations in `save_*_snapshot` into + runtime forward references resolved against this module's globals. + `lcm.__init__` calls this helper once both classes are loaded so the + refs resolve at call time without depending on an ad-hoc assignment + from outside the module. + """ + global Model, SimulationResult # noqa: PLW0603 + Model = model_cls # ty: ignore[invalid-assignment] + SimulationResult = simulation_result_cls # ty: ignore[invalid-assignment] + + logger = logging.getLogger(__name__) @@ -34,7 +70,7 @@ class SolveSnapshot: """Snapshot of a solve run for offline reconstruction.""" - model: Model | None + model: _ModelOrNone """The Model instance.""" params: UserParams | None @@ -51,19 +87,19 @@ class SolveSnapshot: class SimulateSnapshot: """Snapshot of a simulate run for offline reconstruction.""" - model: Model | None + model: _ModelOrNone """The Model instance.""" params: UserParams | None """User parameters passed to simulate.""" - initial_conditions: Mapping[str, Array] | None - """Mapping of state names and "regime" to arrays.""" + initial_conditions: InitialConditions | None + """Immutable mapping of state names and `"regime_id"` to canonical-dtype arrays.""" period_to_regime_to_V_arr: PeriodToRegimeToVArr | None """Immutable mapping of periods to regime value function arrays.""" - result: SimulationResult | None + result: _SimulationResultOrNone """SimulationResult object.""" platform: str @@ -189,7 +225,7 @@ def save_simulate_snapshot( *, model: Model, params: UserParams, - initial_conditions: Mapping[str, Array], + initial_conditions: InitialConditions, period_to_regime_to_V_arr: PeriodToRegimeToVArr, result: SimulationResult, log_path: Path, @@ -200,7 +236,7 @@ def save_simulate_snapshot( Args: model: The Model instance. params: User parameters passed to simulate. - initial_conditions: Mapping of state names and "regime" to arrays. + initial_conditions: Mapping of state names and "regime_id" to arrays. period_to_regime_to_V_arr: Value function arrays. result: SimulationResult object. log_path: Parent directory for snapshot directories. diff --git a/src/lcm/regime.py b/src/lcm/regime.py index 6b4424a96..894f2dc0b 100644 --- a/src/lcm/regime.py +++ b/src/lcm/regime.py @@ -5,6 +5,9 @@ from types import MappingProxyType from typing import Any, Literal, TypeAliasType, cast, overload +from beartype import beartype + +from lcm._beartype_conf import REGIME_CONF from lcm.exceptions import RegimeInitializationError from lcm.grids import DiscreteGrid, Grid from lcm.interfaces import SolveSimulateFunctionPair @@ -24,6 +27,7 @@ ) +@beartype(conf=REGIME_CONF) @dataclass(frozen=True) class MarkovTransition: """Wrapper marking a transition function as stochastic (Markov). @@ -48,11 +52,6 @@ class MarkovTransition: """The transition function returning a probability distribution.""" def __post_init__(self) -> None: - if not callable(self.func): - raise RegimeInitializationError( - f"MarkovTransition requires a callable, " - f"but got {type(self.func).__name__}: {self.func!r}" - ) # Copy __wrapped__ and __annotations__ from the wrapped function so # that inspect.signature and dags see the original signature. We use # object.__setattr__ because the dataclass is frozen. @@ -65,7 +64,9 @@ def __call__(self, *args: Any, **kwargs: Any) -> FloatND: # noqa: ANN401 return self.func(*args, **kwargs) -def _default_H(utility: float, E_next_V: float, discount_factor: float) -> float: +def _default_H( + utility: FloatND, E_next_V: FloatND, discount_factor: FloatND +) -> FloatND: return utility + discount_factor * E_next_V @@ -104,6 +105,7 @@ def __call__( return kwargs[self._state_name] +@beartype(conf=REGIME_CONF) @dataclass(frozen=True, kw_only=True) class Regime: """A user regime which can be processed into an internal regime. @@ -184,11 +186,11 @@ def stochastic_regime_transition(self) -> bool: def __post_init__(self) -> None: from lcm.regime_building.validation import ( # noqa: PLC0415 - validate_attribute_types, validate_logical_consistency, + validate_mapping_contents, ) - validate_attribute_types(self) + validate_mapping_contents(self) validate_logical_consistency(self) def make_immutable(name: str) -> None: diff --git a/src/lcm/regime_building/Q_and_F.py b/src/lcm/regime_building/Q_and_F.py index 814619ddf..371a49018 100644 --- a/src/lcm/regime_building/Q_and_F.py +++ b/src/lcm/regime_building/Q_and_F.py @@ -4,7 +4,6 @@ import jax.numpy as jnp from dags import concatenate_functions, with_signature -from jax import Array from lcm.regime_building.h_dag import _get_build_H_kwargs from lcm.regime_building.next_state import ( @@ -18,6 +17,7 @@ FloatND, FunctionsMapping, InternalUserFunction, + IntND, QAndFFunction, RegimeName, RegimeTransitionFunction, @@ -136,7 +136,7 @@ def get_Q_and_F( ) def Q_and_F( next_regime_to_V_arr: FloatND, - **states_actions_params: Array, + **states_actions_params: FloatND | IntND | BoolND, ) -> tuple[FloatND, BoolND]: """Calculate the state-action value and feasibility for a non-terminal period. @@ -149,7 +149,7 @@ def Q_and_F( A tuple containing the arrays with state-action values and feasibilities. """ - regime_transition_probs: MappingProxyType[str, Array] = ( # ty: ignore[invalid-assignment] + regime_transition_probs: MappingProxyType[RegimeName, FloatND] = ( compute_regime_transition_probs(**states_actions_params) ) U_arr, F_arr = U_and_F(**states_actions_params) @@ -309,15 +309,17 @@ def get_compute_intermediates( args=arg_names_of_compute_intermediates, return_annotation=( "tuple[FloatND, FloatND, FloatND, FloatND, " - "MappingProxyType[RegimeName, Array]]" + "MappingProxyType[RegimeName, FloatND]]" ), ) def compute_intermediates( next_regime_to_V_arr: FloatND, - **states_actions_params: Array, - ) -> tuple[FloatND, FloatND, FloatND, FloatND, MappingProxyType[RegimeName, Array]]: + **states_actions_params: FloatND | IntND | BoolND, + ) -> tuple[ + FloatND, FloatND, FloatND, FloatND, MappingProxyType[RegimeName, FloatND] + ]: """Compute all Q_and_F intermediates.""" - regime_transition_probs: MappingProxyType[str, Array] = ( # ty: ignore[invalid-assignment] + regime_transition_probs: MappingProxyType[RegimeName, FloatND] = ( compute_regime_transition_probs(**states_actions_params) ) U_arr, F_arr = U_and_F(**states_actions_params) @@ -393,7 +395,7 @@ def get_Q_and_F_terminal( ) def Q_and_F( next_regime_to_V_arr: FloatND, # noqa: ARG001 - **states_actions_params: Array, + **states_actions_params: FloatND | IntND | BoolND, ) -> tuple[FloatND, BoolND]: """Calculate the state-action values and feasibilities for a terminal period. diff --git a/src/lcm/regime_building/V.py b/src/lcm/regime_building/V.py index 31521a5c8..e49ae9888 100644 --- a/src/lcm/regime_building/V.py +++ b/src/lcm/regime_building/V.py @@ -5,14 +5,13 @@ import jax.numpy as jnp from dags import concatenate_functions, with_signature from dags.tree import qname_from_tree_path -from jax import Array from lcm.grids import ContinuousGrid, DiscreteGrid, IrregSpacedGrid from lcm.grids.coordinates import get_irreg_coordinate from lcm.regime import Regime from lcm.regime_building.ndimage import map_coordinates from lcm.shocks import _ShockGrid -from lcm.typing import FloatND, ScalarFloat, StateName +from lcm.typing import FloatND, IntND, ScalarFloat, StateName from lcm.utils.functools import all_as_kwargs from lcm.variables import Variables, get_grids @@ -159,7 +158,7 @@ def _get_lookup_function( *, array_name: str, axis_names: list[str], -) -> Callable[..., Array]: +) -> Callable[..., FloatND]: """Create a function that emulates indexing into an array via named axes. Args: @@ -173,8 +172,11 @@ def _get_lookup_function( """ arg_names = [*axis_names, array_name] - @with_signature(args=dict.fromkeys(arg_names, "Array"), return_annotation="Array") - def lookup_wrapper(*args: Array, **kwargs: Array) -> Array: + @with_signature( + args=dict.fromkeys(arg_names, "FloatND | IntND"), + return_annotation="FloatND", + ) + def lookup_wrapper(*args: FloatND | IntND, **kwargs: FloatND | IntND) -> FloatND: kwargs = all_as_kwargs(args=args, kwargs=kwargs, arg_names=arg_names) positions = tuple(kwargs[var] for var in axis_names) return kwargs[array_name][positions] @@ -186,7 +188,7 @@ def _get_coordinate_finder( *, in_name: str, grid: ContinuousGrid, -) -> Callable[..., Array]: +) -> Callable[..., FloatND]: """Create a function that translates a value into coordinates on a grid. The resulting coordinates can be used to do linear interpolation via @@ -210,9 +212,9 @@ def _get_coordinate_finder( arg_names = [in_name, points_param] @with_signature( - args=dict.fromkeys(arg_names, "Array"), return_annotation="Array" + args=dict.fromkeys(arg_names, "FloatND"), return_annotation="FloatND" ) - def find_irreg_coordinate(*args: Array, **kwargs: Array) -> Array: + def find_irreg_coordinate(*args: FloatND, **kwargs: FloatND) -> FloatND: kwargs = all_as_kwargs(args=args, kwargs=kwargs, arg_names=arg_names) return get_irreg_coordinate( value=kwargs[in_name], points=kwargs[points_param] @@ -224,17 +226,19 @@ def find_irreg_coordinate(*args: Array, **kwargs: Array) -> Array: points_jax = grid.to_jax() @with_signature( - args=dict.fromkeys([in_name], "Array"), return_annotation="Array" + args=dict.fromkeys([in_name], "FloatND"), return_annotation="FloatND" ) - def find_irreg_coordinate(*args: Array, **kwargs: Array) -> Array: + def find_irreg_coordinate(*args: FloatND, **kwargs: FloatND) -> FloatND: kwargs = all_as_kwargs(args=args, kwargs=kwargs, arg_names=[in_name]) return get_irreg_coordinate(value=kwargs[in_name], points=points_jax) return find_irreg_coordinate # All other grid types (LinSpaced, LogSpaced, Piecewise*, ShockGrid) - @with_signature(args=dict.fromkeys([in_name], "Array"), return_annotation="Array") - def find_coordinate(*args: Array, **kwargs: Array) -> Array: + @with_signature( + args=dict.fromkeys([in_name], "FloatND"), return_annotation="FloatND" + ) + def find_coordinate(*args: FloatND, **kwargs: FloatND) -> FloatND: kwargs = all_as_kwargs(args=args, kwargs=kwargs, arg_names=[in_name]) return grid.get_coordinate(kwargs[in_name]) @@ -245,7 +249,7 @@ def _get_interpolator( *, name_of_values_on_grid: str, axis_names: list[str], -) -> Callable[..., Array]: +) -> Callable[..., FloatND]: """Create a function interpolator via named axes. Args: @@ -260,8 +264,10 @@ def _get_interpolator( """ arg_names = [name_of_values_on_grid, *axis_names] - @with_signature(args=dict.fromkeys(arg_names, "Array"), return_annotation="Array") - def interpolate(*args: Array, **kwargs: Array) -> Array: + @with_signature( + args=dict.fromkeys(arg_names, "FloatND"), return_annotation="FloatND" + ) + def interpolate(*args: FloatND, **kwargs: FloatND) -> FloatND: kwargs = all_as_kwargs(args=args, kwargs=kwargs, arg_names=arg_names) coordinates = jnp.array([kwargs[var] for var in axis_names]) return map_coordinates( diff --git a/src/lcm/regime_building/argmax.py b/src/lcm/regime_building/argmax.py index a4271e2f9..302fc4d4e 100644 --- a/src/lcm/regime_building/argmax.py +++ b/src/lcm/regime_building/argmax.py @@ -1,15 +1,14 @@ import jax.numpy as jnp -from jax import Array -from lcm.typing import IntND +from lcm.typing import BoolND, FloatND, IntND def argmax_and_max( - a: Array, + a: FloatND | IntND, axis: int | tuple[int, ...] | None = None, initial: float | None = None, - where: Array | None = None, -) -> tuple[IntND, Array]: + where: BoolND | None = None, +) -> tuple[IntND, FloatND | IntND]: """Compute the argmax of an n-dim array along axis. If multiple maxima exist, the first index will be selected. @@ -70,7 +69,9 @@ def argmax_and_max( return _argmax, _max.reshape(_argmax.shape) -def _move_axes_to_back(a: Array, axes: tuple[int, ...]) -> Array: +def _move_axes_to_back( + a: FloatND | IntND | BoolND, axes: tuple[int, ...] +) -> FloatND | IntND | BoolND: """Move specified axes to the back of the array. Args: @@ -85,7 +86,9 @@ def _move_axes_to_back(a: Array, axes: tuple[int, ...]) -> Array: return a.transpose((*front_axes, *axes)) -def _flatten_last_n_axes(a: Array, n: int) -> Array: +def _flatten_last_n_axes( + a: FloatND | IntND | BoolND, n: int +) -> FloatND | IntND | BoolND: """Flatten the last n axes of a to 1 dimension. Args: diff --git a/src/lcm/regime_building/diagnostics.py b/src/lcm/regime_building/diagnostics.py index fb0ac9f17..e5321cdbd 100644 --- a/src/lcm/regime_building/diagnostics.py +++ b/src/lcm/regime_building/diagnostics.py @@ -15,7 +15,6 @@ import jax import jax.numpy as jnp -from jax import Array from lcm.ages import AgeGrid from lcm.grids import Grid @@ -24,7 +23,10 @@ from lcm.regime_building.V import VInterpolationInfo from lcm.typing import ( ActionName, + BoolND, + FloatND, FunctionsMapping, + IntND, RegimeName, RegimeTransitionFunction, StateName, @@ -164,14 +166,19 @@ def _wrap_with_reduction( """ - def reduced(**kwargs: Array) -> dict[str, Any]: + # `kwargs` carries the wrapped function's full input map: the + # `next_regime_to_V_arr` mapping alongside the Float/Int/Bool-valued + # state/action inputs. + def reduced( + **kwargs: MappingProxyType[RegimeName, FloatND] | FloatND | IntND | BoolND, + ) -> dict[str, Any]: U_arr, F_arr, E_next_V, Q_arr, regime_probs = func(**kwargs) F_float = F_arr.astype(float) # NaN-count arrays are masked by feasibility: only feasible cells # contribute to numerators. Infeasible cells are zeroed out because # the solver masks them before the max, so a NaN there never # propagates to V_arr — reporting it would conflate causes. - nan_arrays: dict[str, Array] = { + nan_arrays: dict[str, FloatND] = { "U_nan": jnp.isnan(U_arr).astype(float) * F_float, "E_nan": jnp.isnan(E_next_V).astype(float) * F_float, "Q_nan": jnp.isnan(Q_arr).astype(float) * F_float, diff --git a/src/lcm/regime_building/max_Q_over_a.py b/src/lcm/regime_building/max_Q_over_a.py index f1e5d3913..4c9b3e979 100644 --- a/src/lcm/regime_building/max_Q_over_a.py +++ b/src/lcm/regime_building/max_Q_over_a.py @@ -4,7 +4,6 @@ import jax.numpy as jnp from dags import with_signature -from jax import Array from lcm.regime_building.argmax import argmax_and_max from lcm.typing import ( @@ -80,7 +79,7 @@ def get_max_Q_over_a( ) def max_Q_over_a( next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND], - **states_actions_params: Array, + **states_actions_params: FloatND | IntND | BoolND, ) -> FloatND: Q_arr, F_arr = Q_and_F( next_regime_to_V_arr=next_regime_to_V_arr, @@ -153,7 +152,7 @@ def get_argmax_and_max_Q_over_a( ) def argmax_and_max_Q_over_a( next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND], - **states_actions_params: Array, + **states_actions_params: FloatND | IntND | BoolND, ) -> tuple[IntND, FloatND]: Q_arr, F_arr = Q_and_F( next_regime_to_V_arr=next_regime_to_V_arr, diff --git a/src/lcm/regime_building/ndimage.py b/src/lcm/regime_building/ndimage.py index 8d7d80d97..be0b338a4 100644 --- a/src/lcm/regime_building/ndimage.py +++ b/src/lcm/regime_building/ndimage.py @@ -19,14 +19,16 @@ from collections.abc import Sequence import jax.numpy as jnp -from jax import Array, jit, lax +from jax import jit, lax + +from lcm.typing import FloatND, IntND @jit def map_coordinates( - input: Array, # noqa: A002 - coordinates: Sequence[Array], -) -> Array: + input: FloatND | IntND, # noqa: A002 + coordinates: Sequence[FloatND | IntND] | FloatND | IntND, +) -> FloatND | IntND: """Map the input array to new coordinates using linear interpolation. Modified from JAX implementation of `scipy.ndimage.map_coordinates`. @@ -71,8 +73,8 @@ def map_coordinates( def _compute_indices_and_weights( - coordinate: Array, input_size: int -) -> list[tuple[Array, Array]]: + coordinate: FloatND | IntND, input_size: int +) -> list[tuple[IntND, FloatND | IntND]]: """Compute indices and weights for linear interpolation.""" lower_index = jnp.clip(jnp.floor(coordinate), 0, input_size - 2).astype(jnp.int32) upper_weight = coordinate - lower_index @@ -80,15 +82,15 @@ def _compute_indices_and_weights( return [(lower_index, lower_weight), (lower_index + 1, upper_weight)] -def _multiply_all(arrs: Sequence[Array]) -> Array: +def _multiply_all(arrs: Sequence[FloatND | IntND]) -> FloatND | IntND: """Multiply all arrays in the sequence.""" return functools.reduce(operator.mul, arrs) -def _sum_all(arrs: Sequence[Array]) -> Array: +def _sum_all(arrs: Sequence[FloatND | IntND]) -> FloatND | IntND: """Sum all arrays in the sequence.""" return functools.reduce(operator.add, arrs) -def _round_half_away_from_zero(a: Array) -> Array: +def _round_half_away_from_zero(a: FloatND | IntND) -> FloatND | IntND: return a if jnp.issubdtype(a.dtype, jnp.integer) else lax.round(a) diff --git a/src/lcm/regime_building/next_state.py b/src/lcm/regime_building/next_state.py index 1e81f0f23..e0639471e 100644 --- a/src/lcm/regime_building/next_state.py +++ b/src/lcm/regime_building/next_state.py @@ -6,7 +6,6 @@ import jax from dags import concatenate_functions, with_signature from dags.tree import qname_from_tree_path -from jax import Array from lcm.grids import Grid from lcm.shocks import _ShockGrid @@ -17,6 +16,7 @@ DiscreteState, FloatND, FunctionsMapping, + IntND, NextStateSimulationFunction, RegimeName, ShockName, @@ -93,7 +93,7 @@ def get_next_state_function_for_simulation( Returns `{target_regime_name: {next_: array}}`. """ - per_target_funcs: dict[RegimeName, Callable[..., dict[str, Array]]] = {} + per_target_funcs: dict[RegimeName, Callable[..., dict[str, FloatND | IntND]]] = {} for target, target_transitions in transitions.items(): extended = _extend_target_transitions_for_simulation( target=target, @@ -125,7 +125,7 @@ def get_next_stochastic_weights_function( functions: FunctionsMapping, transitions: FunctionsMapping, stochastic_transition_names: frozenset[TransitionFunctionName], -) -> Callable[..., dict[str, Array]]: +) -> Callable[..., dict[str, FloatND | IntND]]: """Get function that computes the weights for the next stochastic states. Args: @@ -155,11 +155,13 @@ def get_next_stochastic_weights_function( def _extend_target_transitions_for_simulation( *, target: RegimeName, - target_transitions: MappingProxyType[TransitionFunctionName, Callable[..., Array]], + target_transitions: MappingProxyType[ + TransitionFunctionName, Callable[..., FloatND | IntND] + ], all_grids: MappingProxyType[RegimeName, MappingProxyType[StateOrActionName, Grid]], variables: Variables, stochastic_transition_names: frozenset[TransitionFunctionName], -) -> dict[TransitionFunctionName, Callable[..., Array]]: +) -> dict[TransitionFunctionName, Callable[..., FloatND | IntND]]: """Replace stochastic transitions for one target with realisation wrappers. Deterministic transitions are passed through unchanged. Stochastic transitions @@ -185,7 +187,7 @@ def _extend_target_transitions_for_simulation( """ shock_names: frozenset[ShockName] = frozenset(variables.shock_names) - extended: dict[TransitionFunctionName, Callable[..., Array]] = dict( + extended: dict[TransitionFunctionName, Callable[..., FloatND | IntND]] = dict( target_transitions ) for next_state_name in target_transitions: @@ -236,7 +238,7 @@ def _create_discrete_stochastic_next_func( qname = qname_from_tree_path((target, next_state_name)) @with_signature( - args={f"weight_{qname}": "FloatND", f"key_{qname}": "dict[str, Array]"}, + args={f"weight_{qname}": "FloatND", f"key_{qname}": "PRNGKeyND"}, return_annotation="DiscreteState", ) def next_stochastic_state(**kwargs: FloatND) -> DiscreteState: @@ -292,9 +294,9 @@ def _create_ar1_next_func( qname_from_tree_path((state_name, p)): p for p in grid.params_to_pass_at_runtime } args: dict[str, str] = { - f"key_{qname}": "dict[str, Array]", + f"key_{qname}": "PRNGKeyND", state_name: "ContinuousState", - **dict.fromkeys(runtime_param_names, "float"), + **dict.fromkeys(runtime_param_names, "FloatND"), } _draw_shock = grid.draw_shock @@ -323,8 +325,8 @@ def _create_iid_next_func( qname_from_tree_path((state_name, p)): p for p in grid.params_to_pass_at_runtime } args: dict[str, str] = { - f"key_{qname}": "dict[str, Array]", - **dict.fromkeys(runtime_param_names, "float"), + f"key_{qname}": "PRNGKeyND", + **dict.fromkeys(runtime_param_names, "FloatND"), } _draw_shock = grid.draw_shock diff --git a/src/lcm/regime_building/processing.py b/src/lcm/regime_building/processing.py index 0b0c78945..aa9c79f77 100644 --- a/src/lcm/regime_building/processing.py +++ b/src/lcm/regime_building/processing.py @@ -9,7 +9,6 @@ from dags import concatenate_functions, get_annotations, with_signature from dags.signature import rename_arguments from dags.tree import QNAME_DELIMITER, qname_from_tree_path, tree_path_from_qname -from jax import Array from jax import numpy as jnp from lcm.ages import AgeGrid @@ -45,9 +44,11 @@ from lcm.typing import ( ArgmaxQOverAFunction, Float1D, + FloatND, FunctionsMapping, Int1D, InternalUserFunction, + IntND, MaxQOverAFunction, NextStateSimulationFunction, QAndFFunction, @@ -866,7 +867,7 @@ def _get_stochastic_next_function_for_shock( @with_signature(args={f"{name}": "ContinuousState"}, return_annotation="Int1D") def next_func(**kwargs: Any) -> Int1D: # noqa: ARG001, ANN401 - return jnp.arange(grid.shape[0]) + return jnp.arange(grid.shape[0], dtype=jnp.int32) return next_func @@ -884,11 +885,16 @@ def _get_weights_func_for_shock(*, name: str, grid: _ShockGrid) -> UserFunction: runtime_param_names = { qname_from_tree_path((name, p)): p for p in grid.params_to_pass_at_runtime } - args = {name: "ContinuousState", **dict.fromkeys(runtime_param_names, "float")} + args = { + name: "ContinuousState", + **dict.fromkeys(runtime_param_names, "FloatND"), + } @with_signature(args=args, return_annotation="FloatND", enforce=False) - def weights_func_runtime(*a: Array, **kwargs: Array) -> Float1D: # noqa: ARG001 - shock_kw: dict[str, float] = { # ty: ignore[invalid-assignment] + def weights_func_runtime(*a: FloatND, **kwargs: FloatND) -> Float1D: # noqa: ARG001 + # `grid.params` is canonical (0-d JAX scalars) from its own + # boundary cast; `kwargs` arrive as JAX tracers from JIT. + shock_kw: dict[str, FloatND | IntND] = { **fixed_params, **{raw: kwargs[qn] for qn, raw in runtime_param_names.items()}, } @@ -899,7 +905,7 @@ def weights_func_runtime(*a: Array, **kwargs: Array) -> Float1D: # noqa: ARG001 input=transition_probs, coordinates=[ jnp.full(n_points, fill_value=coord), - jnp.arange(n_points), + jnp.arange(n_points, dtype=jnp.int32), ], ) @@ -913,13 +919,13 @@ def weights_func_runtime(*a: Array, **kwargs: Array) -> Float1D: # noqa: ARG001 return_annotation="FloatND", enforce=False, ) - def weights_func(*args: Array, **kwargs: Array) -> Float1D: # noqa: ARG001 + def weights_func(*args: FloatND, **kwargs: FloatND) -> Float1D: # noqa: ARG001 coordinate = get_irreg_coordinate(value=kwargs[f"{name}"], points=gridpoints) return map_coordinates( input=transition_probs, coordinates=[ jnp.full(grid.n_points, fill_value=coordinate), - jnp.arange(grid.n_points), + jnp.arange(grid.n_points, dtype=jnp.int32), ], ) @@ -1256,7 +1262,8 @@ def _wrap_regime_transition_probs( regime_names_to_ids: Immutable mapping of regime names to integer indices. Returns: - A wrapped function that returns MappingProxyType[str, float|Array]. + A wrapped function that returns an immutable mapping of regime + names to probability scalars. """ # Get regime names in index order from regime_names_to_ids. Coerce @@ -1276,8 +1283,8 @@ def _wrap_regime_transition_probs( ) @functools.wraps(func) def wrapped( - *args: Array | int, - **kwargs: Array | int, + *args: FloatND | IntND | int, + **kwargs: FloatND | IntND | int, ) -> MappingProxyType[str, Any]: result = func(*args, **kwargs) # Convert array to dict using ordering by regime id @@ -1285,6 +1292,11 @@ def wrapped( {name: result[idx] for idx, name in enumerate(regime_names)} ) + # Pin `__annotations__` on the final wrapper: `concatenate_functions` + # reads `__annotations__` (not `__signature__`) to reconcile the DAG, and + # the decorator stack can drop them when `func` carries deferred (PEP 649) + # annotations through `functools.wraps`. + wrapped.__annotations__ = {**annotations, "return": return_annotation} return wrapped @@ -1312,15 +1324,20 @@ def _wrap_deterministic_regime_transition( # Preserve original annotations but update return type annotations = {k: v for k, v in get_annotations(func).items() if k != "return"} - @with_signature(args=annotations, return_annotation="Array") + @with_signature(args=annotations, return_annotation="FloatND") @functools.wraps(func) def wrapped( - *args: Array | int, - **kwargs: Array | int, - ) -> Array: + *args: FloatND | IntND | int, + **kwargs: FloatND | IntND | int, + ) -> FloatND: regime_idx = func(*args, **kwargs) return jax.nn.one_hot(regime_idx, n_regimes) + # Pin `__annotations__` on the final wrapper: `concatenate_functions` + # reads `__annotations__` (not `__signature__`) to reconcile the DAG, and + # the decorator stack can drop them when `func` carries deferred (PEP 649) + # annotations through `functools.wraps`. + wrapped.__annotations__ = {**annotations, "return": "FloatND"} return wrapped diff --git a/src/lcm/regime_building/validation.py b/src/lcm/regime_building/validation.py index b51a0fdad..471d16548 100644 --- a/src/lcm/regime_building/validation.py +++ b/src/lcm/regime_building/validation.py @@ -30,53 +30,32 @@ ) -def validate_attribute_types(regime: Regime) -> None: # noqa: C901, PLR0912 - """Validate the types of the regime attributes.""" - error_messages = [] - - # Validate types of states and actions - for attr_name in ("actions", "states"): - attr = getattr(regime, attr_name) - if isinstance(attr, Mapping): - for k, v in attr.items(): - if not isinstance(k, str): - error_messages.append(f"{attr_name} key {k} must be a string.") - if not isinstance(v, Grid): - error_messages.append(f"{attr_name} value {v} must be an LCM grid.") - else: - error_messages.append(f"{attr_name} must be a mapping.") +def validate_mapping_contents(regime: Regime) -> None: + """Exhaustively check key/value types of `regime`'s mapping fields. - # Validate types of function mappings (constraints and functions) - function_collections = [ - regime.constraints, - regime.functions, - ] - for func_collection in function_collections: - if isinstance(func_collection, Mapping): - for k, v in func_collection.items(): - if not isinstance(k, str): - error_messages.append( - f"function keys must be a strings, but is {k}." - ) - if not callable(v) and not isinstance(v, SolveSimulateFunctionPair): - error_messages.append( - f"function values must be a callable, but is {v}." - ) - else: - error_messages.append( - "constraints and functions must each be a mapping of callables." - ) + Beartype on `Regime` catches top-level type mismatches and a sampled + Mapping entry, but does not deep-check every key/value of a Mapping + parameter — especially when the value type is a `Callable`/`Protocol`, + which beartype skips entirely. This function fills that gap by + iterating each entry and reporting all type violations together via + the standard `error_messages` aggregator. - # Validate state_transitions is a mapping - if not isinstance(regime.state_transitions, Mapping): - error_messages.append("state_transitions must be a mapping.") + """ + error_messages: list[str] = [] - # Validate regime transition is callable or None - if not regime.terminal and not callable(regime.transition): - error_messages.append( - "transition must be callable or None, " - f"but is {type(regime.transition).__name__}." - ) + for attr_name in ("states", "actions"): + for k, v in getattr(regime, attr_name).items(): + if not isinstance(k, str): + error_messages.append(f"{attr_name} key {k!r} must be a string.") + if not isinstance(v, Grid): + error_messages.append(f"{attr_name} value {v!r} must be an LCM grid.") + + for attr_name in ("functions", "constraints"): + for k, v in getattr(regime, attr_name).items(): + if not isinstance(k, str): + error_messages.append(f"{attr_name} key {k!r} must be a string.") + if not callable(v) and not isinstance(v, SolveSimulateFunctionPair): + error_messages.append(f"{attr_name} value {v!r} must be a callable.") if error_messages: msg = format_messages(error_messages) @@ -262,7 +241,7 @@ def _find_function_output_grid_indexing( def collect_state_transitions( - states: Mapping[StateName, Grid], + states: Mapping[StateName, Grid | None], state_transitions: Mapping[ StateName, UserFunction | Callable | None | Mapping[RegimeName, UserFunction | Callable], diff --git a/src/lcm/shocks/_base.py b/src/lcm/shocks/_base.py index 24e33fcbd..de2b1fd80 100644 --- a/src/lcm/shocks/_base.py +++ b/src/lcm/shocks/_base.py @@ -1,21 +1,23 @@ from abc import abstractmethod from dataclasses import dataclass, fields from types import MappingProxyType -from typing import ClassVar, overload +from typing import ClassVar import jax.numpy as jnp import numpy as np -from jax import Array from jax.scipy.stats.norm import cdf from lcm.exceptions import GridInitializationError from lcm.grids import ContinuousGrid from lcm.grids import coordinates as grid_coordinates -from lcm.typing import Float1D, FloatND, ScalarFloat +from lcm.typing import Float1D, FloatND, ScalarFloat, ScalarInt def _gauss_hermite_normal( - *, n_points: int, mu: float | Float1D, sigma: float | Float1D + *, + n_points: int, + mu: ScalarFloat, + sigma: ScalarFloat, ) -> tuple[Float1D, Float1D]: """Compute Gauss-Hermite quadrature nodes and weights for $N(\\mu, \\sigma^2)$. @@ -59,15 +61,27 @@ def _param_field_names(self) -> tuple[str, ...]: ) @property - def params(self) -> MappingProxyType[str, float]: - """Mapping of the distribution's parameters' names to their specified values.""" - return MappingProxyType( - { - name: getattr(self, name) - for name in self._param_field_names - if getattr(self, name) is not None - } - ) + def params(self) -> MappingProxyType[str, ScalarFloat | ScalarInt]: + """Distribution parameters as canonical 0-d JAX scalars. + + Boundary cast: dataclass fields supplied by the user as Python + `bool` / `int` / `float` are returned as `ScalarInt` / `ScalarFloat` + so every consumer downstream — `compute_gridpoints`, + `compute_transition_probs`, the regime-building runtime closures — + sees the canonical dtype. + + """ + out: dict[str, ScalarFloat | ScalarInt] = {} + for name in self._param_field_names: + value = getattr(self, name) + if value is None: + continue + # `bool` before `int` — `True` is a Python `int` subclass. + if isinstance(value, bool | int): + out[name] = jnp.int32(value) + else: + out[name] = jnp.asarray(value) + return MappingProxyType(out) @property def params_to_pass_at_runtime(self) -> tuple[str, ...]: @@ -82,11 +96,11 @@ def is_fully_specified(self) -> bool: return not self.params_to_pass_at_runtime @abstractmethod - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: """Compute discretized gridpoints for the shock distribution.""" @abstractmethod - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: """Compute transition probability matrix for the shock distribution.""" def get_gridpoints(self) -> Float1D: @@ -115,11 +129,7 @@ def to_jax(self) -> Float1D: """Convert the grid to a Jax array.""" return self.get_gridpoints() - @overload - def get_coordinate(self, value: ScalarFloat) -> ScalarFloat: ... - @overload - def get_coordinate(self, value: Array) -> Array: ... - def get_coordinate(self, value: ScalarFloat | Array) -> ScalarFloat | Array: + def get_coordinate(self, value: FloatND) -> FloatND: """Return the generalized coordinate of a value in the grid.""" if not self.is_fully_specified: raise GridInitializationError( @@ -150,11 +160,11 @@ def _validate_gauss_hermite_grid( def _mixture_cdf( *, x: FloatND, - p1: float, - mu1: float, - sigma1: float, - mu2: float, - sigma2: float, + p1: ScalarFloat, + mu1: ScalarFloat, + sigma1: ScalarFloat, + mu2: ScalarFloat, + sigma2: ScalarFloat, ) -> FloatND: """Evaluate the CDF of a two-component normal mixture. diff --git a/src/lcm/shocks/ar1.py b/src/lcm/shocks/ar1.py index b307a7b78..1f74f06ff 100644 --- a/src/lcm/shocks/ar1.py +++ b/src/lcm/shocks/ar1.py @@ -5,15 +5,17 @@ import jax import jax.numpy as jnp +from beartype import beartype from jax.scipy.stats.norm import cdf +from lcm._beartype_conf import GRID_CONF from lcm.shocks._base import ( _gauss_hermite_normal, _mixture_cdf, _ShockGrid, _validate_gauss_hermite_grid, ) -from lcm.typing import Float1D, FloatND +from lcm.typing import Float1D, FloatND, PRNGKeyND, ScalarFloat, ScalarInt @dataclass(frozen=True, kw_only=True) @@ -23,12 +25,13 @@ class _ShockGridAR1(_ShockGrid): @abstractmethod def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - current_value: Float1D, - ) -> Float1D: ... + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + current_value: ScalarFloat, + ) -> ScalarFloat: ... +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class Tauchen(_ShockGridAR1): r"""AR(1) shock discretized via Tauchen (1986). @@ -49,16 +52,16 @@ class Tauchen(_ShockGridAR1): gauss_hermite: bool """Use Gauss-Hermite quadrature nodes and weights.""" - rho: float | None = None + rho: float | int | None = None """Persistence parameter of the AR(1) process.""" - sigma: float | None = None + sigma: float | int | None = None """Standard deviation of the innovation.""" - mu: float | None = None + mu: float | int | None = None """Intercept (drift) of the AR(1) process.""" - n_std: float | None = None + n_std: float | int | None = None """Number of standard deviations for the grid boundary.""" def __post_init__(self) -> None: @@ -75,7 +78,7 @@ def _param_field_names(self) -> tuple[str, ...]: exclude = exclude | {"n_std"} return tuple(f.name for f in fields(self) if f.name not in exclude) - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: n_points = self.n_points rho, sigma, mu = kwargs["rho"], kwargs["sigma"], kwargs["mu"] std_y = jnp.sqrt(sigma**2 / (1 - rho**2)) @@ -88,14 +91,14 @@ def compute_gridpoints(self, **kwargs: float) -> Float1D: x = jnp.linspace(-x_max, x_max, n_points) return x + mu / (1 - rho) - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: n_points = self.n_points rho, sigma = kwargs["rho"], kwargs["sigma"] std_y = jnp.sqrt(sigma**2 / (1 - rho**2)) if self.gauss_hermite: nodes, _weights = _gauss_hermite_normal( - n_points=n_points, mu=0.0, sigma=std_y + n_points=n_points, mu=jnp.asarray(0.0), sigma=std_y ) else: n_std = kwargs["n_std"] @@ -117,10 +120,10 @@ def compute_transition_probs(self, **kwargs: float) -> FloatND: def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - current_value: Float1D, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + current_value: ScalarFloat, + ) -> ScalarFloat: return ( params["mu"] + params["rho"] * current_value @@ -128,6 +131,7 @@ def draw_shock( ) +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class Rouwenhorst(_ShockGridAR1): r"""AR(1) shock discretized via Rouwenhorst (1995). @@ -140,23 +144,23 @@ class Rouwenhorst(_ShockGridAR1): """ - rho: float | None = None + rho: float | int | None = None """Persistence parameter of the AR(1) process.""" - sigma: float | None = None + sigma: float | int | None = None """Standard deviation of the innovation.""" - mu: float | None = None + mu: float | int | None = None """Intercept (drift) of the AR(1) process.""" - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: n_points = self.n_points rho, sigma, mu = kwargs["rho"], kwargs["sigma"], kwargs["mu"] nu = jnp.sqrt((n_points - 1) / (1 - rho**2)) * sigma long_run_mean = mu / (1.0 - rho) return jnp.linspace(long_run_mean - nu, long_run_mean + nu, n_points) - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: n_points = self.n_points rho = kwargs["rho"] q = (rho + 1) / 2 @@ -185,10 +189,10 @@ def compute_transition_probs(self, **kwargs: float) -> FloatND: def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - current_value: Float1D, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + current_value: ScalarFloat, + ) -> ScalarFloat: return ( params["mu"] + params["rho"] * current_value @@ -196,6 +200,7 @@ def draw_shock( ) +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class TauchenNormalMixture(_ShockGridAR1): r"""AR(1) shock with mixture-of-normals innovations, discretized via Tauchen. @@ -211,44 +216,44 @@ class TauchenNormalMixture(_ShockGridAR1): """ - rho: float | None = None + rho: float | int | None = None """Persistence parameter of the AR(1) process.""" - mu: float | None = None + mu: float | int | None = None """Intercept (drift) of the AR(1) process.""" - n_std: float | None = None + n_std: float | int | None = None """Number of unconditional standard deviations for the grid boundary.""" - p1: float | None = None + p1: float | int | None = None """Probability of the first mixture component.""" - mu1: float | None = None + mu1: float | int | None = None """Mean of the first mixture component.""" - sigma1: float | None = None + sigma1: float | int | None = None """Standard deviation of the first mixture component.""" - mu2: float | None = None + mu2: float | int | None = None """Mean of the second mixture component.""" - sigma2: float | None = None + sigma2: float | int | None = None """Standard deviation of the second mixture component.""" @staticmethod def _innovation_variance( *, - p1: float, - mu1: float, - sigma1: float, - mu2: float, - sigma2: float, - ) -> float: + p1: ScalarFloat, + mu1: ScalarFloat, + sigma1: ScalarFloat, + mu2: ScalarFloat, + sigma2: ScalarFloat, + ) -> ScalarFloat: """Compute the variance of the mixture innovation.""" mean_eps = p1 * mu1 + (1 - p1) * mu2 return p1 * (sigma1**2 + mu1**2) + (1 - p1) * (sigma2**2 + mu2**2) - mean_eps**2 - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: n_points = self.n_points rho, mu = kwargs["rho"], kwargs["mu"] n_std = kwargs["n_std"] @@ -264,7 +269,7 @@ def compute_gridpoints(self, **kwargs: float) -> Float1D: x_max = n_std * std_y return jnp.linspace(long_run_mean - x_max, long_run_mean + x_max, n_points) - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: n_points = self.n_points rho, mu = kwargs["rho"], kwargs["mu"] n_std = kwargs["n_std"] @@ -298,10 +303,10 @@ def compute_transition_probs(self, **kwargs: float) -> FloatND: def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - current_value: Float1D, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + current_value: ScalarFloat, + ) -> ScalarFloat: key1, key2 = jax.random.split(key) component = jax.random.bernoulli(key1, params["p1"]) normal = jax.random.normal(key2) diff --git a/src/lcm/shocks/iid.py b/src/lcm/shocks/iid.py index 60096024c..a6b745ddc 100644 --- a/src/lcm/shocks/iid.py +++ b/src/lcm/shocks/iid.py @@ -4,15 +4,17 @@ import jax import jax.numpy as jnp +from beartype import beartype from jax.scipy.stats.norm import cdf +from lcm._beartype_conf import GRID_CONF from lcm.shocks._base import ( _gauss_hermite_normal, _mixture_cdf, _ShockGrid, _validate_gauss_hermite_grid, ) -from lcm.typing import Float1D, FloatND +from lcm.typing import Float1D, FloatND, PRNGKeyND, ScalarFloat, ScalarInt @dataclass(frozen=True, kw_only=True) @@ -22,11 +24,12 @@ class _ShockGridIID(_ShockGrid): @abstractmethod def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - ) -> Float1D: ... + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + ) -> ScalarFloat: ... +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class Uniform(_ShockGridIID): r"""Discretized iid uniform shock: $U(\text{start}, \text{stop})$. @@ -36,31 +39,32 @@ class Uniform(_ShockGridIID): """ - start: float | None = None + start: float | int | None = None """Lower bound of the uniform distribution.""" - stop: float | None = None + stop: float | int | None = None """Upper bound of the uniform distribution.""" - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: return jnp.linspace( start=kwargs["start"], stop=kwargs["stop"], num=self.n_points ) - def compute_transition_probs(self, **kwargs: float) -> FloatND: # noqa: ARG002 + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: # noqa: ARG002 n_points = self.n_points return jnp.full((n_points, n_points), fill_value=1 / n_points) def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + ) -> ScalarFloat: return jax.random.uniform( key=key, minval=params["start"], maxval=params["stop"] ) +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class Normal(_ShockGridIID): r"""Discretized iid normal shock: $N(\mu_\varepsilon, \sigma_\varepsilon^2)$. @@ -75,13 +79,13 @@ class Normal(_ShockGridIID): gauss_hermite: bool """Use Gauss-Hermite quadrature nodes and weights.""" - mu: float | None = None + mu: float | int | None = None """Mean of the shock distribution.""" - sigma: float | None = None + sigma: float | int | None = None """Standard deviation of the shock distribution.""" - n_std: float | None = None + n_std: float | int | None = None """Number of standard deviations from the mean to the grid boundary.""" def __post_init__(self) -> None: @@ -96,7 +100,7 @@ def _param_field_names(self) -> tuple[str, ...]: exclude = exclude | {"n_std"} return tuple(f.name for f in fields(self) if f.name not in exclude) - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: n_points = self.n_points mu, sigma = kwargs["mu"], kwargs["sigma"] if self.gauss_hermite: @@ -109,7 +113,7 @@ def compute_gridpoints(self, **kwargs: float) -> Float1D: x_max = mu + n_std * sigma return jnp.linspace(start=x_min, stop=x_max, num=n_points) - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: n_points = self.n_points mu, sigma = kwargs["mu"], kwargs["sigma"] if self.gauss_hermite: @@ -129,12 +133,13 @@ def compute_transition_probs(self, **kwargs: float) -> FloatND: def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + ) -> ScalarFloat: return params["mu"] + params["sigma"] * jax.random.normal(key=key) +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class LogNormal(_ShockGridIID): r"""Discretized iid log-normal shock: $\ln X \sim N(\mu, \sigma^2)$.""" @@ -142,13 +147,13 @@ class LogNormal(_ShockGridIID): gauss_hermite: bool """Use Gauss-Hermite quadrature nodes and weights.""" - mu: float | None = None + mu: float | int | None = None """Mean of the underlying normal distribution ($E[\\ln X]$).""" - sigma: float | None = None + sigma: float | int | None = None """Standard deviation of the underlying normal distribution.""" - n_std: float | None = None + n_std: float | int | None = None """Number of standard deviations in log-space for the grid boundary.""" def __post_init__(self) -> None: @@ -163,7 +168,7 @@ def _param_field_names(self) -> tuple[str, ...]: exclude = exclude | {"n_std"} return tuple(f.name for f in fields(self) if f.name not in exclude) - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: n_points = self.n_points mu, sigma = kwargs["mu"], kwargs["sigma"] if self.gauss_hermite: @@ -174,7 +179,7 @@ def compute_gridpoints(self, **kwargs: float) -> Float1D: n_std = kwargs["n_std"] return jnp.exp(jnp.linspace(mu - n_std * sigma, mu + n_std * sigma, n_points)) - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: n_points = self.n_points mu, sigma = kwargs["mu"], kwargs["sigma"] if self.gauss_hermite: @@ -194,12 +199,13 @@ def compute_transition_probs(self, **kwargs: float) -> FloatND: def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + ) -> ScalarFloat: return jnp.exp(params["mu"] + params["sigma"] * jax.random.normal(key=key)) +@beartype(conf=GRID_CONF) @dataclass(frozen=True, kw_only=True) class NormalMixture(_ShockGridIID): r"""Discretized IID normal-mixture shock. @@ -215,25 +221,25 @@ class NormalMixture(_ShockGridIID): """ - n_std: float | None = None + n_std: float | int | None = None """Number of mixture standard deviations for the grid boundary.""" - p1: float | None = None + p1: float | int | None = None """Probability of the first mixture component.""" - mu1: float | None = None + mu1: float | int | None = None """Mean of the first mixture component.""" - sigma1: float | None = None + sigma1: float | int | None = None """Standard deviation of the first mixture component.""" - mu2: float | None = None + mu2: float | int | None = None """Mean of the second mixture component.""" - sigma2: float | None = None + sigma2: float | int | None = None """Standard deviation of the second mixture component.""" - def compute_gridpoints(self, **kwargs: float) -> Float1D: + def compute_gridpoints(self, **kwargs: ScalarFloat | ScalarInt) -> Float1D: n_points = self.n_points n_std = kwargs["n_std"] p1, mu1, sigma1 = kwargs["p1"], kwargs["mu1"], kwargs["sigma1"] @@ -248,7 +254,7 @@ def compute_gridpoints(self, **kwargs: float) -> Float1D: mean_eps - n_std * std_eps, mean_eps + n_std * std_eps, n_points ) - def compute_transition_probs(self, **kwargs: float) -> FloatND: + def compute_transition_probs(self, **kwargs: ScalarFloat | ScalarInt) -> FloatND: n_points = self.n_points n_std = kwargs["n_std"] p1, mu1, sigma1 = kwargs["p1"], kwargs["mu1"], kwargs["sigma1"] @@ -278,9 +284,9 @@ def compute_transition_probs(self, **kwargs: float) -> FloatND: def draw_shock( self, - params: MappingProxyType[str, float | FloatND], - key: FloatND, - ) -> Float1D: + params: MappingProxyType[str, ScalarFloat | ScalarInt], + key: PRNGKeyND, + ) -> ScalarFloat: key1, key2 = jax.random.split(key) component = jax.random.bernoulli(key1, params["p1"]) normal = jax.random.normal(key2) diff --git a/src/lcm/simulation/compile.py b/src/lcm/simulation/compile.py index 06a8ceff7..60e554a73 100644 --- a/src/lcm/simulation/compile.py +++ b/src/lcm/simulation/compile.py @@ -21,7 +21,6 @@ import jax import jax.numpy as jnp from dags.tree import qname_from_tree_path -from jax import Array from lcm.ages import AgeGrid from lcm.interfaces import InternalRegime @@ -32,7 +31,9 @@ ) from lcm.typing import ( FlatRegimeParams, + FloatND, InternalParams, + IntND, RegimeName, ) from lcm.utils.logging import format_duration @@ -340,7 +341,7 @@ def _build_argmax_args( ages: AgeGrid, period: int, n_subjects: int, - next_regime_to_V_arr: MappingProxyType[RegimeName, Array], + next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND], ) -> dict[str, object]: base = internal_regime.state_action_space(regime_params=regime_params) subject_states = _subject_shape_arrays(base.states, n_subjects=n_subjects) @@ -419,10 +420,10 @@ def _build_crtp_args( def _subject_shape_arrays( - base_arrays: Mapping[str, Array], + base_arrays: Mapping[str, FloatND | IntND], *, n_subjects: int, -) -> dict[str, Array]: +) -> dict[str, FloatND | IntND]: """Return zeros of shape `(n_subjects,)` mirroring each base array's dtype. With `build_initial_states` casting discrete states to the grid dtype, diff --git a/src/lcm/simulation/initial_conditions.py b/src/lcm/simulation/initial_conditions.py index c65db11b6..725e48495 100644 --- a/src/lcm/simulation/initial_conditions.py +++ b/src/lcm/simulation/initial_conditions.py @@ -7,16 +7,19 @@ from collections.abc import Callable, Mapping, Sequence from types import MappingProxyType -from typing import Never, cast +from typing import NoReturn, cast import jax import numpy as np import pandas as pd -from jax import Array from jax import numpy as jnp from lcm.ages import PSEUDO_STATE_NAMES, AgeGrid -from lcm.dtypes import canonical_float_dtype, safe_to_float_dtype +from lcm.dtypes import ( + canonical_float_dtype, + safe_to_float_dtype, + safe_to_int_dtype, +) from lcm.exceptions import ( InvalidInitialConditionsError, PyLCMError, @@ -27,13 +30,20 @@ from lcm.regime_building.Q_and_F import _get_feasibility from lcm.typing import ( ActionName, + BoolND, FlatRegimeParams, + Float1D, + FloatND, + InitialConditions, + Int1D, InternalParams, + IntND, RegimeIdsToNames, RegimeName, RegimeNamesToIds, StateName, StatesPerRegime, + UserInitialConditions, ) from lcm.utils.containers import invert_regime_ids from lcm.utils.functools import get_union_of_args @@ -44,9 +54,57 @@ MISSING_CAT_CODE = jnp.iinfo(jnp.int32).min +def canonicalize_initial_conditions( + *, + initial_conditions: UserInitialConditions, + internal_regimes: MappingProxyType[RegimeName, InternalRegime], +) -> InitialConditions: + """Cast every initial-conditions array to its canonical pylcm dtype. + + This is pylcm's simulation input boundary: `"regime_id"` and discrete + states cast to `int32`; `"age"` and continuous states cast to the canonical + float dtype. Keys that match no model state are cast by their array kind + (integer arrays to `int32`, otherwise to canonical float) and left for + `validate_initial_conditions` to report. Downstream validation and the + simulate stack receive canonical-dtype arrays and do not re-cast. + + Args: + initial_conditions: Mapping of state names (plus `"regime_id"`) to + user-supplied arrays of any integer or floating dtype. + internal_regimes: Immutable mapping of regime names to internal regime + instances, used to classify each state as discrete or continuous. + + Returns: + Mapping of the same keys to JAX arrays at their canonical dtype. + + """ + discrete_state_names = { + state_name + for internal_regime in internal_regimes.values() + for state_name, grid in internal_regime.grids.items() + if isinstance(grid, DiscreteGrid) + } + known_state_names = { + state_name + for internal_regime in internal_regimes.values() + for state_name in internal_regime.grids + } + canonical: dict[str, FloatND | IntND] = {} + for name, value in initial_conditions.items(): + if name == "regime_id" or name in discrete_state_names: + canonical[name] = safe_to_int_dtype(value, name=name) + elif name == "age" or name in known_state_names: + canonical[name] = safe_to_float_dtype(value, name=name) + elif np.asarray(value).dtype.kind in "iu": + canonical[name] = safe_to_int_dtype(value, name=name) + else: + canonical[name] = safe_to_float_dtype(value, name=name) + return MappingProxyType(canonical) + + def build_initial_states( *, - initial_states: Mapping[StateName, Array], + initial_states: Mapping[StateName, Float1D | Int1D], internal_regimes: MappingProxyType[RegimeName, InternalRegime], ) -> StatesPerRegime: """Build the regime-keyed state carrier from user-provided initial states. @@ -66,10 +124,12 @@ def build_initial_states( """ n_subjects = len(next(iter(initial_states.values()))) - states_per_regime: dict[RegimeName, MappingProxyType[StateName, Array]] = {} + states_per_regime: dict[ + RegimeName, MappingProxyType[StateName, Float1D | Int1D] + ] = {} for regime_name, internal_regime in internal_regimes.items(): - regime_states: dict[StateName, Array] = {} + regime_states: dict[StateName, Float1D | Int1D] = {} # Logic for distribution of subjects over devices distributed = any(grid.distributed for grid in internal_regime.grids.values()) devices = jax.devices() @@ -121,7 +181,7 @@ def build_initial_states( def validate_initial_conditions( *, - initial_conditions: Mapping[str, Array], + initial_conditions: InitialConditions, internal_regimes: MappingProxyType[RegimeName, InternalRegime], regime_names_to_ids: RegimeNamesToIds, internal_params: InternalParams, @@ -130,14 +190,14 @@ def validate_initial_conditions( """Validate initial conditions (regimes, states, and feasibility). Checks that: - 1. `"regime"` is present, non-empty, and contains only valid regime IDs + 1. `"regime_id"` is present, non-empty, and contains only valid regime IDs 2. All required state names (across all regimes) are provided, with no extras 3. All arrays have the same length 4. Discrete state values are valid codes 5. Each subject has at least one feasible action combination Args: - initial_conditions: Mapping of state names (plus `"regime"`) to arrays. + initial_conditions: Mapping of state names (plus `"regime_id"`) to arrays. internal_regimes: Immutable mapping of regime names to internal regime instances. regime_names_to_ids: Immutable mapping of regime names to integer IDs. @@ -154,10 +214,10 @@ def validate_initial_conditions( regime_ids_to_names = invert_regime_ids(regime_names_to_ids) # Extract regime array - regime_arr = initial_conditions.get("regime") + regime_arr = initial_conditions.get("regime_id") if regime_arr is None: raise InvalidInitialConditionsError( - format_messages(["'regime' must be provided in initial_conditions."]) + format_messages(["'regime_id' must be provided in initial_conditions."]) ) # Vectorized regime ID validity check @@ -174,7 +234,7 @@ def validate_initial_conditions( ) ) - initial_states = {k: v for k, v in initial_conditions.items() if k != "regime"} + initial_states = {k: v for k, v in initial_conditions.items() if k != "regime_id"} # Validate regime names and state names/shapes first; early-exit on errors so that # downstream checks (discrete codes, feasibility) can assume correct names. @@ -239,8 +299,8 @@ def _format_missing_states_message(missing: set[str], required: set[str]) -> str def _collect_state_name_errors( *, - initial_states: Mapping[StateName, Array], - regime_id_arr: Array, + initial_states: Mapping[StateName, FloatND | IntND], + regime_id_arr: Int1D, regime_ids_to_names: RegimeIdsToNames, internal_regimes: MappingProxyType[RegimeName, InternalRegime], valid_regime_names: set[RegimeName], @@ -297,8 +357,8 @@ def _collect_state_name_errors( def _collect_structural_errors( *, - initial_states: Mapping[StateName, Array], - regime_id_arr: Array, + initial_states: Mapping[StateName, FloatND | IntND], + regime_id_arr: Int1D, regime_ids_to_names: RegimeIdsToNames, regime_names_to_ids: RegimeNamesToIds, internal_regimes: MappingProxyType[RegimeName, InternalRegime], @@ -369,12 +429,17 @@ def _collect_structural_errors( else: # Validate that each subject's initial regime is active at their starting age. # Only safe to run when all ages are valid (so age_to_period lookup succeeds). - periods = jnp.array([ages.age_to_period(a.item()) for a in age_values]) + periods = jnp.array( + [ages.age_to_period(a.item()) for a in age_values], dtype=jnp.int32 + ) active_mask = jnp.ones(regime_id_arr.size, dtype=bool) for regime_name, internal_regime in internal_regimes.items(): in_regime = regime_id_arr == regime_names_to_ids[regime_name] - period_active = jnp.isin(periods, jnp.array(internal_regime.active_periods)) + period_active = jnp.isin( + periods, + jnp.array(internal_regime.active_periods, dtype=jnp.int32), + ) active_mask = active_mask & (~in_regime | period_active) if not jnp.all(active_mask): @@ -397,8 +462,8 @@ def _collect_structural_errors( def _collect_feasibility_errors( *, - initial_states: Mapping[StateName, Array], - regime_id_arr: Array, + initial_states: Mapping[StateName, FloatND | IntND], + regime_id_arr: Int1D, regime_names_to_ids: RegimeNamesToIds, internal_regimes: MappingProxyType[RegimeName, InternalRegime], internal_params: InternalParams, @@ -448,9 +513,9 @@ def _collect_feasibility_errors( def _validate_discrete_state_values( *, - initial_states: Mapping[StateName, Array], + initial_states: Mapping[StateName, FloatND | IntND], internal_regimes: MappingProxyType[RegimeName, InternalRegime], - regime_id_arr: Array, + regime_id_arr: Int1D, regime_names_to_ids: RegimeNamesToIds, ) -> None: """Validate that discrete state values are valid codes. @@ -512,12 +577,12 @@ def _validate_discrete_state_values( def _batched_feasibility_check( *, - feasibility_func: Callable[..., Array], - subject_states: Mapping[StateName, Array], - action_kwargs: Mapping[str, Array], + feasibility_func: Callable[..., BoolND], + subject_states: Mapping[str, FloatND | IntND], + action_kwargs: Mapping[str, FloatND | IntND], filtered_params: Mapping[str, object], - flat_actions: Mapping[ActionName, Array], -) -> Array: + flat_actions: Mapping[ActionName, FloatND | IntND], +) -> BoolND: """Check feasibility for all subjects, batching to avoid OOM. Vmaps over action combos individually (like solve/simulate do) so each @@ -540,12 +605,14 @@ def _batched_feasibility_check( if action_kwargs: def _is_combo_feasible( - action_kw: dict[str, Array], - subject_kw: dict[str, Array], - ) -> Array: + action_kw: dict[str, FloatND | IntND], + subject_kw: dict[str, FloatND | IntND], + ) -> BoolND: return feasibility_func(**action_kw, **subject_kw, **filtered_params) - def _is_any_action_feasible(per_subject_kwargs: dict[str, Array]) -> Array: + def _is_any_action_feasible( + per_subject_kwargs: dict[str, FloatND | IntND], + ) -> BoolND: per_combo = jax.vmap(_is_combo_feasible, in_axes=(0, None))( action_kwargs, per_subject_kwargs, @@ -554,7 +621,9 @@ def _is_any_action_feasible(per_subject_kwargs: dict[str, Array]) -> Array: else: - def _is_any_action_feasible(per_subject_kwargs: dict[str, Array]) -> Array: + def _is_any_action_feasible( + per_subject_kwargs: dict[str, FloatND | IntND], + ) -> BoolND: return jnp.any(feasibility_func(**per_subject_kwargs, **filtered_params)) vmapped_check = jax.vmap(_is_any_action_feasible) @@ -569,7 +638,7 @@ def _is_any_action_feasible(per_subject_kwargs: dict[str, Array]) -> Array: if n_subjects <= batch_size: return vmapped_check(subject_states) - results: list[Array] = [] + results: list[BoolND] = [] for start in range(0, n_subjects, batch_size): end = min(start + batch_size, n_subjects) batch = {k: v[start:end] for k, v in subject_states.items()} @@ -581,7 +650,7 @@ def _check_regime_feasibility( # noqa: C901 *, internal_regime: InternalRegime, regime_name: RegimeName, - initial_states: Mapping[StateName, Array], + initial_states: Mapping[StateName, FloatND | IntND], subject_indices: list[int], regime_params: Mapping[str, object], ages: AgeGrid, @@ -617,7 +686,7 @@ def _check_regime_feasibility( # noqa: C901 state_action_space = internal_regime.state_action_space( regime_params=cast("FlatRegimeParams", MappingProxyType(dict(regime_params))), ) - action_grids: dict[str, Array] = { + action_grids: dict[ActionName, FloatND | IntND] = { **state_action_space.discrete_actions, **state_action_space.continuous_actions, } @@ -632,8 +701,8 @@ def _check_regime_feasibility( # noqa: C901 needs_period = "period" in accepted # Build per-subject state arrays - idx_arr = jnp.array(subject_indices) - subject_states: dict[StateName, Array] = {} + idx_arr = jnp.array(subject_indices, dtype=jnp.int32) + subject_states: dict[StateName, FloatND | IntND] = {} for sn in state_names: if sn in accepted: subject_states[sn] = initial_states[sn][idx_arr] @@ -642,11 +711,12 @@ def _check_regime_feasibility( # noqa: C901 subject_states["age"] = initial_states["age"][idx_arr] if needs_period: subject_states["period"] = jnp.array( - [ages.age_to_period(a.item()) for a in initial_states["age"][idx_arr]] + [ages.age_to_period(a.item()) for a in initial_states["age"][idx_arr]], + dtype=jnp.int32, ) # Split actions and params — actions are vmapped over, params are not - action_kwargs: dict[str, Array] = { + action_kwargs: dict[str, FloatND | IntND] = { k: v for k, v in flat_actions.items() if k in accepted } @@ -672,7 +742,7 @@ def _check_regime_feasibility( # noqa: C901 # No per-subject varying states: feasibility is identical for all subjects. if action_kwargs: - def _check_combo(action_kw: dict[str, Array]) -> Array: + def _check_combo(action_kw: dict[str, FloatND | IntND]) -> BoolND: return feasibility_func(**action_kw, **filtered_params) # ty: ignore[invalid-argument-type] result = jax.vmap(_check_combo)(action_kwargs) @@ -704,14 +774,14 @@ def _check_combo(action_kw: dict[str, Array]) -> Array: def _admits_any_action( *, - feasibility_func: Callable[..., Array], - action_kwargs: Mapping[str, Array], + feasibility_func: Callable[..., BoolND], + action_kwargs: Mapping[str, FloatND | IntND], params: Mapping[str, object], ) -> bool: """Return True iff the feasibility function admits ≥ 1 action under params.""" if action_kwargs: - def _check_combo(action_kw: dict[str, Array]) -> Array: + def _check_combo(action_kw: dict[str, FloatND | IntND]) -> BoolND: return feasibility_func(**action_kw, **params) per_combo = jax.vmap(_check_combo)(action_kwargs) @@ -722,10 +792,10 @@ def _check_combo(action_kw: dict[str, Array]) -> Array: def _per_constraint_feasibility( *, internal_regime: InternalRegime, - subject_states: Mapping[StateName, Array], + subject_states: Mapping[str, FloatND | IntND], regime_params: Mapping[str, object], - flat_actions: Mapping[ActionName, Array], - idx_arr: Array, + flat_actions: Mapping[ActionName, FloatND | IntND], + idx_arr: Int1D, infeasible_indices: Sequence[int], ) -> dict[str, np.ndarray]: """Per-constraint feasibility for the infeasible subjects. @@ -789,8 +859,8 @@ def _raise_feasibility_type_error( exc: TypeError, regime_name: RegimeName, internal_regime: InternalRegime, - subject_states: dict[StateName, Array], -) -> Never: + subject_states: dict[StateName, FloatND | IntND], +) -> NoReturn: """Re-raise a TypeError from feasibility checking with diagnostic context. Args: @@ -835,7 +905,7 @@ def _format_infeasibility_message( infeasible_indices: Sequence[int], internal_regime: InternalRegime, regime_name: RegimeName, - initial_states: Mapping[StateName, Array], + initial_states: Mapping[StateName, FloatND | IntND], state_names: Sequence[str], per_constraint_admits_any: Mapping[str, np.ndarray], ) -> str: @@ -902,8 +972,8 @@ def _format_infeasibility_message( def _build_flat_action_grid( *, action_names: list[ActionName], - grids: MappingProxyType[str, Array], -) -> dict[str, Array]: + grids: MappingProxyType[str, FloatND | IntND], +) -> dict[str, FloatND | IntND]: """Build a flat array of all action combinations from action grids. Args: diff --git a/src/lcm/simulation/random.py b/src/lcm/simulation/random.py index b89c0b0eb..69189bc0c 100644 --- a/src/lcm/simulation/random.py +++ b/src/lcm/simulation/random.py @@ -1,12 +1,13 @@ import os import jax -from jax import Array + +from lcm.typing import PRNGKeyND def generate_simulation_keys( - *, key: Array, names: list[str], n_initial_states: int -) -> tuple[Array, dict[str, Array]]: + *, key: PRNGKeyND, names: list[str], n_initial_states: int +) -> tuple[PRNGKeyND, dict[str, PRNGKeyND]]: """Generate pseudo-random number generator keys (PRNG keys) for simulation. PRNG keys in JAX are immutable objects used to control random number generation. diff --git a/src/lcm/simulation/result.py b/src/lcm/simulation/result.py index e5f8c0cb4..44fb57907 100644 --- a/src/lcm/simulation/result.py +++ b/src/lcm/simulation/result.py @@ -12,7 +12,6 @@ import jax.numpy as jnp import pandas as pd from dags import concatenate_functions -from jax import Array from lcm.ages import AgeGrid from lcm.exceptions import InvalidAdditionalTargetsError @@ -23,9 +22,11 @@ from lcm.regime_building.processing import compute_merged_discrete_categories from lcm.typing import ( ActionName, + BoolND, FlatRegimeParams, FloatND, InternalParams, + IntND, RegimeName, RegimeNamesToIds, StateName, @@ -238,7 +239,7 @@ def get_simulation_output_dtypes( Returns: Immutable mapping of variable name to `pd.CategoricalDtype`. Includes - all discrete state/action variables plus the `"regime"` column. + all discrete state/action variables plus the `"regime_name"` column. """ merged_categories, ordered_flags = compute_merged_discrete_categories(regimes) @@ -250,7 +251,7 @@ def get_simulation_output_dtypes( ordered=ordered_flags[var_name], ) - dtypes["regime"] = pd.CategoricalDtype( + dtypes["regime_name"] = pd.CategoricalDtype( categories=list(regime_names_to_ids.keys()), ordered=False, ) @@ -322,7 +323,7 @@ def _compute_metadata( discrete_categories: dict[str, tuple[str, ...]] = {} discrete_ordered: dict[str, bool] = {} for var_name, dtype in simulation_output_dtypes.items(): - if var_name == "regime": + if var_name == "regime_name": continue discrete_categories[var_name] = tuple(dtype.categories) discrete_ordered[var_name] = bool(dtype.ordered) @@ -490,13 +491,15 @@ def _process_regime( ] # Concatenate and filter to in-regime subjects - data: dict[str, Array | Sequence[str]] = _concatenate_and_filter(period_dicts) # ty: ignore[invalid-assignment] + data: dict[str, FloatND | IntND | BoolND | Sequence[str]] = _concatenate_and_filter( + period_dicts + ) # ty: ignore[invalid-assignment] # Add age column (computed from period using ages grid) data["age"] = ages.values[data["period"]] # noqa: PD011 # Add regime name - data["regime"] = [internal_regime.name] * len(data["period"]) + data["regime_name"] = [internal_regime.name] * len(data["period"]) # Compute additional targets if additional_targets: @@ -521,10 +524,10 @@ def _extract_period_data( period: int, regime_states: tuple[str, ...], regime_actions: tuple[str, ...], -) -> dict[str, Array]: +) -> dict[str, FloatND | IntND | BoolND]: """Extract data from a single period's simulation results.""" - data: dict[str, Array] = { - "subject_id": jnp.arange(len(result.in_regime)), + data: dict[str, FloatND | IntND | BoolND] = { + "subject_id": jnp.arange(len(result.in_regime), dtype=jnp.int32), "period": jnp.full_like(result.in_regime, period, dtype=jnp.int32), "_in_regime": result.in_regime, "value": result.V_arr, @@ -541,7 +544,9 @@ def _extract_period_data( return data -def _concatenate_and_filter(period_dicts: list[dict[str, Array]]) -> dict[str, Array]: +def _concatenate_and_filter( + period_dicts: list[dict[str, FloatND | IntND | BoolND]], +) -> dict[str, FloatND | IntND | BoolND]: """Concatenate period data and filter to in-regime subjects.""" keys = [k for k in period_dicts[0] if k != "_in_regime"] @@ -585,7 +590,7 @@ def _empty_dataframe( action_names: list[ActionName], ) -> pd.DataFrame: """Create empty DataFrame with correct columns.""" - columns = ["subject_id", "period", "regime", "value"] + columns = ["subject_id", "period", "regime_name", "value"] columns.extend(state_names) columns.extend(action_names) return pd.DataFrame(columns=pd.Index(columns)) @@ -613,8 +618,8 @@ def _reorder_columns( state_names: list[StateName], action_names: list[ActionName], ) -> pd.DataFrame: - """Reorder columns: subject_id, period, regime, value, states, actions, rest.""" - base = ["subject_id", "period", "regime", "value"] + """Reorder columns: id, period, regime_name, value, states, actions, rest.""" + base = ["subject_id", "period", "regime_name", "value"] known = set(base) | set(state_names) | set(action_names) rest = [c for c in df.columns if c not in known] return df[base + state_names + action_names + rest] @@ -628,14 +633,16 @@ def _convert_to_categorical( """Convert discrete columns to pandas Categorical dtype with string labels. Converts: - - regime column: uses regime_names as categories + - regime_name column: uses regime_names as categories - discrete state/action columns: uses categories from simulation metadata """ df = df.copy() - # Convert regime column - df["regime"] = pd.Categorical(df["regime"], categories=metadata.regime_names) + # Convert regime name column + df["regime_name"] = pd.Categorical( + df["regime_name"], categories=metadata.regime_names + ) # Convert discrete state and action columns for var_name, merged_categories in metadata.discrete_categories.items(): @@ -690,7 +697,7 @@ def _remap_codes_per_regime( if regime_cats is None: continue - mask = df["regime"] == regime_name + mask = df["regime_name"] == regime_name if not mask.any(): continue @@ -745,11 +752,11 @@ def _codes_to_categorical( def _compute_targets( *, - data: dict[str, Array | Sequence[str]], + data: dict[str, FloatND | IntND | BoolND | Sequence[str]], targets: list[str], internal_regime: InternalRegime, regime_params: FlatRegimeParams, -) -> dict[str, Array]: +) -> dict[str, FloatND | IntND | BoolND]: """Compute additional targets for a regime.""" functions_pool = _build_functions_pool(internal_regime) target_func = _create_target_function( diff --git a/src/lcm/simulation/simulate.py b/src/lcm/simulation/simulate.py index 70c6f0d6c..efcd61f3d 100644 --- a/src/lcm/simulation/simulate.py +++ b/src/lcm/simulation/simulate.py @@ -6,7 +6,7 @@ import jax import jax.numpy as jnp import pandas as pd -from jax import Array, vmap +from jax import vmap from lcm.ages import AgeGrid from lcm.interfaces import ( @@ -25,14 +25,18 @@ create_regime_state_action_space, ) from lcm.typing import ( + Float1D, FloatND, + InitialConditions, Int1D, InternalParams, IntND, + PRNGKeyND, RegimeName, RegimeNamesToIds, ScalarFloat, ScalarInt, + StateOrActionName, StatesPerRegime, ) from lcm.utils.containers import invert_regime_ids @@ -49,7 +53,7 @@ def simulate( *, internal_params: InternalParams, - initial_conditions: Mapping[str, Array], + initial_conditions: InitialConditions, internal_regimes: MappingProxyType[RegimeName, InternalRegime], regime_names_to_ids: RegimeNamesToIds, logger: logging.Logger, @@ -64,10 +68,11 @@ def simulate( Args: internal_params: Immutable mapping of regime names to flat parameter mappings. - initial_conditions: Flat mapping of state names (plus `"regime"`) to arrays. - All arrays must have the same length (number of subjects). The `"regime"` - entry must contain integer regime codes. - Example: {"wealth": jnp.array([10.0, 50.0]), "regime": jnp.array([0, 0])} + initial_conditions: Flat mapping of state names (plus `"regime_id"`) to + arrays. All arrays must have the same length (number of subjects). + The `"regime_id"` entry must contain integer regime codes. + Example: + {"wealth": jnp.array([10.0, 50.0]), "regime_id": jnp.array([0, 0])} internal_regimes: Immutable mapping of regime names to internal regime instances. regime_names_to_ids: Immutable mapping of regime names to integer indices. @@ -91,7 +96,7 @@ def simulate( total_start = time.monotonic() # Extract state arrays from initial conditions, which include the regime on top. - initial_states = {k: v for k, v in initial_conditions.items() if k != "regime"} + initial_states = {k: v for k, v in initial_conditions.items() if k != "regime_id"} # Preparations key = jax.random.key(seed=seed) @@ -104,7 +109,7 @@ def simulate( initial_ages=initial_states["age"], ages=ages ) subject_regime_ids = jnp.full_like( - initial_conditions["regime"], MISSING_CAT_CODE, dtype=jnp.int32 + initial_conditions["regime_id"], MISSING_CAT_CODE, dtype=jnp.int32 ) # Forward simulation @@ -122,7 +127,7 @@ def simulate( # Activate subjects whose starting period matches the current period subject_regime_ids = jnp.where( starting_periods == period, - initial_conditions["regime"], + initial_conditions["regime_id"], subject_regime_ids, ) @@ -215,8 +220,8 @@ def _simulate_regime_in_period( internal_params: InternalParams, regime_names_to_ids: RegimeNamesToIds, active_regimes_next_period: tuple[RegimeName, ...], - key: Array, -) -> tuple[PeriodRegimeSimulationData, StatesPerRegime, Int1D, Array]: + key: PRNGKeyND, +) -> tuple[PeriodRegimeSimulationData, StatesPerRegime, Int1D, PRNGKeyND]: """Simulate one regime for one period. This function processes all subjects in a given regime for a single period, @@ -335,8 +340,8 @@ def _simulate_regime_in_period( def _lookup_values_from_indices( *, flat_indices: IntND, - grids: MappingProxyType[str, Array], -) -> MappingProxyType[str, Array]: + grids: MappingProxyType[StateOrActionName, FloatND | IntND], +) -> MappingProxyType[StateOrActionName, FloatND | IntND]: """Retrieve values from indices. Args: @@ -369,7 +374,7 @@ def _lookup_values_from_indices( def _compute_starting_periods( *, - initial_ages: Array, + initial_ages: Float1D, ages: AgeGrid, ) -> Int1D: """Convert per-subject initial ages to starting period indices. diff --git a/src/lcm/simulation/transitions.py b/src/lcm/simulation/transitions.py index 484fe9f12..9d407a587 100644 --- a/src/lcm/simulation/transitions.py +++ b/src/lcm/simulation/transitions.py @@ -10,8 +10,8 @@ import jax from dags.tree import qname_from_tree_path -from jax import Array, vmap from jax import numpy as jnp +from jax import vmap from lcm.interfaces import InternalRegime, StateActionSpace from lcm.simulation.random import generate_simulation_keys @@ -20,7 +20,11 @@ ActionName, Bool1D, FlatRegimeParams, + Float1D, + FloatND, Int1D, + IntND, + PRNGKeyND, RegimeName, RegimeNamesToIds, RegimeStates, @@ -69,13 +73,13 @@ def create_regime_state_action_space( def calculate_next_states( *, internal_regime: InternalRegime, - optimal_actions: MappingProxyType[ActionName, Array], + optimal_actions: MappingProxyType[ActionName, FloatND | IntND], period: int, age: ScalarInt | ScalarFloat, regime_params: FlatRegimeParams, states_per_regime: StatesPerRegime, state_action_space: StateActionSpace, - key: Array, + key: PRNGKeyND, subjects_in_regime: Bool1D, ) -> StatesPerRegime: """Calculate next period states for subjects in a regime. @@ -159,14 +163,14 @@ def calculate_next_regime_membership( *, internal_regime: InternalRegime, state_action_space: StateActionSpace, - optimal_actions: MappingProxyType[ActionName, Array], + optimal_actions: MappingProxyType[ActionName, FloatND | IntND], period: int, age: ScalarInt | ScalarFloat, regime_params: FlatRegimeParams, regime_names_to_ids: RegimeNamesToIds, new_subject_regime_ids: Int1D, active_regimes_next_period: tuple[RegimeName, ...], - key: Array, + key: PRNGKeyND, subjects_in_regime: Bool1D, ) -> Int1D: """Calculate next period regime membership for subjects in a regime. @@ -196,7 +200,7 @@ def calculate_next_regime_membership( """ # Compute regime transition probabilities # --------------------------------------------------------------------------------- - regime_transition_probs: MappingProxyType[str, Array] = ( # ty: ignore[invalid-assignment] + regime_transition_probs: MappingProxyType[RegimeName, FloatND] = ( internal_regime.simulate_functions.compute_regime_transition_probs( # ty: ignore[call-non-callable] **state_action_space.states, **optimal_actions, @@ -230,9 +234,9 @@ def calculate_next_regime_membership( def draw_key_from_dict( *, - d: MappingProxyType[RegimeName, Array], + d: MappingProxyType[RegimeName, Float1D], regime_names_to_ids: RegimeNamesToIds, - keys: Array, + keys: PRNGKeyND, ) -> Int1D: """Draw a random key from a dictionary of arrays. @@ -256,9 +260,9 @@ def draw_key_from_dict( ) def random_id( - key: Array, - p: Array, - ) -> Int1D: + key: PRNGKeyND, + p: Float1D, + ) -> ScalarInt: return jax.random.choice( key, regime_ids, @@ -298,7 +302,7 @@ def _advance_states_for_subjects( Updated carrier with next-period values written in for selected subjects. """ - updated: dict[RegimeName, dict[StateName, Array]] = { + updated: dict[RegimeName, dict[StateName, Float1D | Int1D]] = { regime_name: dict(regime_states) for regime_name, regime_states in states_per_regime.items() } diff --git a/src/lcm/solution/solve_brute.py b/src/lcm/solution/solve_brute.py index 3a9a8b9ed..4d88c6a05 100644 --- a/src/lcm/solution/solve_brute.py +++ b/src/lcm/solution/solve_brute.py @@ -12,7 +12,7 @@ from lcm.ages import AgeGrid from lcm.interfaces import InternalRegime, _build_regime_sharding -from lcm.typing import FloatND, InternalParams, RegimeName, StateName +from lcm.typing import BoolND, FloatND, InternalParams, RegimeName, StateName from lcm.utils.error_handling import validate_V from lcm.utils.logging import ( format_duration, @@ -107,8 +107,8 @@ def solve( diagnostic_min: list[FloatND] = [] diagnostic_max: list[FloatND] = [] diagnostic_mean: list[FloatND] = [] - running_any_nan: FloatND = jnp.zeros((), dtype=bool) - running_any_inf: FloatND = jnp.zeros((), dtype=bool) + running_any_nan: BoolND = jnp.zeros((), dtype=bool) + running_any_inf: BoolND = jnp.zeros((), dtype=bool) logger.info("Starting solution") total_start = time.monotonic() @@ -436,7 +436,7 @@ def _get_regime_V_shapes_and_shardings( return topology -def _build_zero_V_arr(*, topology: _RegimeVTopology) -> jax.Array: +def _build_zero_V_arr(*, topology: _RegimeVTopology) -> FloatND: """Build the zero V-array template for a regime, sharded where requested.""" zeros = jnp.zeros(topology.shape) if topology.sharding is None: @@ -471,18 +471,17 @@ def _emit_post_loop_diagnostics( solution: MappingProxyType[int, MappingProxyType[RegimeName, FloatND]], internal_regimes: MappingProxyType[RegimeName, InternalRegime], internal_params: InternalParams, - running_any_nan: FloatND, - running_any_inf: FloatND, + running_any_nan: BoolND, + running_any_inf: BoolND, diagnostic_min: list[FloatND] | None, diagnostic_max: list[FloatND] | None, diagnostic_mean: list[FloatND] | None, ) -> None: """Flush async diagnostics: raise on NaN, warn on Inf, log debug stats. - The two `.item()` calls on the running scalars decide whether to - enter the per-row failure-path localisation. On a healthy solve - neither inner walk runs and no per-row scalar is materialised, so - device memory stays bounded by the V templates currently in flight. + Only enters the per-row failure path when the running NaN or Inf + accumulators are set, so a healthy solve incurs no host-side scalar + materialisation here. """ if running_any_nan.item(): _raise_first_nan_row( @@ -516,9 +515,7 @@ def _raise_first_nan_row( ) -> None: """Find the first NaN-bearing (regime, period) and raise. - Only invoked on the failure path (`running_any_nan` was True). - Materialises one host-side bool per row until the first hit; on - a healthy solve this function is never called. + Failure-path only — walks rows until the first NaN hit. """ for row in diagnostic_rows: V_arr = solution[row.period][row.regime_name] diff --git a/src/lcm/state_action_space.py b/src/lcm/state_action_space.py index 32f59bb1e..ed0fe2283 100644 --- a/src/lcm/state_action_space.py +++ b/src/lcm/state_action_space.py @@ -1,11 +1,10 @@ from types import MappingProxyType import jax.numpy as jnp -from jax import Array from lcm.grids import Grid, IrregSpacedGrid from lcm.interfaces import StateActionSpace -from lcm.typing import StateName, StateOrActionName +from lcm.typing import FloatND, IntND, StateName, StateOrActionName from lcm.variables import Variables @@ -13,7 +12,7 @@ def create_state_action_space( *, variables: Variables, grids: MappingProxyType[StateOrActionName, Grid], - states: dict[StateName, Array] | None = None, + states: dict[StateName, FloatND | IntND] | None = None, ) -> StateActionSpace: """Create a state-action-space. @@ -58,7 +57,7 @@ def create_state_action_space( ) -def _grid_to_jax_or_placeholder(grid: Grid) -> Array: +def _grid_to_jax_or_placeholder(grid: Grid) -> FloatND | IntND: """Return the grid's points, or a NaN placeholder for runtime-supplied grids. `IrregSpacedGrid.to_jax()` raises when its points haven't been supplied — that @@ -74,7 +73,9 @@ def _grid_to_jax_or_placeholder(grid: Grid) -> Array: def _validate_all_states_present( - *, provided_states: dict[StateName, Array], required_state_names: set[StateName] + *, + provided_states: dict[StateName, FloatND | IntND], + required_state_names: set[StateName], ) -> None: """Check that all states are present in the provided states.""" provided_state_names = set(provided_states) diff --git a/src/lcm/typing.py b/src/lcm/typing.py index f93b70e52..ada8acb40 100644 --- a/src/lcm/typing.py +++ b/src/lcm/typing.py @@ -1,13 +1,15 @@ from collections.abc import Mapping +from fractions import Fraction from types import MappingProxyType -from typing import Any, Protocol +from typing import Any, Literal, Protocol, runtime_checkable +import numpy as np import pandas as pd from jax import Array -from jaxtyping import Bool, Float, Int32, Scalar +from jaxtyping import Bool, Float, Int32, Key, Scalar -from lcm.params import MappingLeaf -from lcm.params.sequence_leaf import SequenceLeaf +from lcm.params import MappingLeaf, UserMappingLeaf +from lcm.params.sequence_leaf import SequenceLeaf, UserSequenceLeaf type ContinuousState = Float[Array, "..."] type ContinuousAction = Float[Array, "..."] @@ -27,8 +29,16 @@ type ScalarFloat = Float[Scalar, ""] type ScalarBool = Bool[Scalar, ""] +# JAX PRNG keys (`jax.random`) carry the dedicated `key` dtype, which +# jaxtyping matches via `Key` — distinct from `FloatND`/`IntND`. Covers both a +# single 0-d key and a batched 1-d array of keys. +type PRNGKeyND = Key[Array, "..."] + type Period = ScalarInt type Age = ScalarInt | ScalarFloat +# Boundary form accepted by `AgeGrid.__init__` for `start`, `stop`, and +# `exact_values` entries — converted to canonical JAX scalars internally. +type UserAge = int | Fraction type RegimeName = str type StateName = str type ActionName = str @@ -45,20 +55,59 @@ RegimeName, MappingProxyType[TransitionFunctionName, InternalUserFunction] ] -type RegimeStates = MappingProxyType[StateName, Array] +type RegimeStates = MappingProxyType[StateName, Float1D | Int1D] type StatesPerRegime = MappingProxyType[RegimeName, RegimeStates] +# Boundary form of initial conditions — accepted by `Model.simulate` and +# canonicalized by `canonicalize_initial_conditions`. +type UserInitialConditions = Mapping[ + StateName | Literal["regime_id"], Array | np.ndarray +] -type _ParamsLeaf = bool | float | Array | pd.Series | MappingLeaf | SequenceLeaf +# Post-canonicalization form — emitted by `canonicalize_initial_conditions` +# and consumed by `validate_initial_conditions`, `simulate`, and persistence. +# Read-protocol typing so callers don't have to wrap a dict in +# `MappingProxyType` before passing it in; pylcm producers still wrap on +# the way out to preserve immutability at runtime. Values are 1-D arrays +# of length `n_subjects`; the validator checks the rank-1 invariant. +type InitialConditions = Mapping[StateName | Literal["regime_id"], Float1D | Int1D] + + +# Boundary leaf type — accepted by `Model.__init__` / `Model.solve` / +# `Model.simulate` and canonicalized by `cast_params_to_canonical_dtypes`. +type _UserParamsLeaf = ( + bool + | int + | float + | FloatND + | IntND + | BoolND + | np.ndarray + | pd.Series + | UserMappingLeaf + | UserSequenceLeaf +) type UserParams = Mapping[ + str, + _UserParamsLeaf | Mapping[str, _UserParamsLeaf | Mapping[str, _UserParamsLeaf]], +] + +# Post-canonicalization leaf type — output of +# `cast_params_to_canonical_dtypes`. Only canonical-dtype JAX arrays and +# canonical-narrow `MappingLeaf` / `SequenceLeaf` instances survive. +type _ParamsLeaf = FloatND | IntND | BoolND | MappingLeaf | SequenceLeaf +type Params = Mapping[ str, _ParamsLeaf | Mapping[str, _ParamsLeaf | Mapping[str, _ParamsLeaf]], ] # Internal regime parameters: A flat mapping with function-qualified names. # Keys are always function-qualified (e.g., "utility__risk_aversion", -# "H__discount_factor"). Values are scalars or arrays. -type FlatRegimeParams = MappingProxyType[str, Array] +# "H__discount_factor"). Values are canonical-dtype JAX arrays or +# canonical-narrow container leaves. +type FlatRegimeParams = MappingProxyType[ + str, FloatND | IntND | BoolND | MappingLeaf | SequenceLeaf +] type InternalParams = MappingProxyType[RegimeName, FlatRegimeParams] # Immutable templates, used internally @@ -72,16 +121,19 @@ type PeriodToRegimeToVArr = MappingProxyType[int, MappingProxyType[RegimeName, FloatND]] +@runtime_checkable class UserFunction(Protocol): """A function provided by the user. - Only used for type checking. + Used for both type checking and beartype runtime checks on perimeter + constructors. Any callable satisfies this protocol structurally. """ def __call__(self, *args: Any, **kwargs: Any) -> Any: ... # noqa: ANN401 +@runtime_checkable class InternalUserFunction(Protocol): """The internal representation of a function provided by the user. @@ -91,15 +143,18 @@ class InternalUserFunction(Protocol): def __call__( self, - *args: Array | float, - **kwargs: Array | float, - ) -> Array: ... + *args: FloatND | IntND | BoolND | float | MappingLeaf | SequenceLeaf, + **kwargs: FloatND | IntND | BoolND | float | MappingLeaf | SequenceLeaf, + ) -> FloatND | IntND | BoolND: ... +@runtime_checkable class RegimeTransitionFunction(Protocol): - """The regime transition function provided by the user. + """The processed regime transition function for the solve phase. - Returns an array of transition probabilities indexed by regime ID. + Wraps the user's `next_regime` function so its output is a mapping of + target regime name to a transition-probability array, rather than a + raw array indexed by regime id. Only used for type checking. @@ -107,15 +162,18 @@ class RegimeTransitionFunction(Protocol): def __call__( self, - *args: Array | float, - **kwargs: Array | float, - ) -> Float1D: ... + *args: FloatND | IntND | BoolND | float | MappingLeaf | SequenceLeaf, + **kwargs: FloatND | IntND | BoolND | float | MappingLeaf | SequenceLeaf, + ) -> MappingProxyType[RegimeName, FloatND]: ... +@runtime_checkable class VmappedRegimeTransitionFunction(Protocol): - """The vmapped regime transition function. + """The processed regime transition function for the simulate phase. - Returns a 2D array of transition probabilities with shape [n_regimes, n_subjects]. + The `vmap`-over-subjects counterpart of `RegimeTransitionFunction`: + same mapping output, with each probability array carrying a leading + per-subject axis. Only used for type checking. @@ -123,11 +181,12 @@ class VmappedRegimeTransitionFunction(Protocol): def __call__( self, - *args: Array | float, - **kwargs: Array | float, - ) -> FloatND: ... + *args: FloatND | IntND | BoolND | float | MappingLeaf | SequenceLeaf, + **kwargs: FloatND | IntND | BoolND | float | MappingLeaf | SequenceLeaf, + ) -> MappingProxyType[RegimeName, FloatND]: ... +@runtime_checkable class QAndFFunction(Protocol): """The function that computes Q and F. @@ -145,6 +204,7 @@ def __call__( ) -> tuple[FloatND, BoolND]: ... +@runtime_checkable class MaxQOverAFunction(Protocol): """The function that maximizes Q over all actions. @@ -157,11 +217,12 @@ class MaxQOverAFunction(Protocol): def __call__( self, - next_regime_to_V_arr: MappingProxyType[RegimeName, Array], + next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND], **kwargs: Any, # noqa: ANN401 - ) -> Array: ... + ) -> FloatND: ... +@runtime_checkable class ArgmaxQOverAFunction(Protocol): """The function that finds the argmax of Q over all actions. @@ -174,11 +235,12 @@ class ArgmaxQOverAFunction(Protocol): def __call__( self, - next_regime_to_V_arr: MappingProxyType[RegimeName, Array], + next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND], **kwargs: Any, # noqa: ANN401 - ) -> tuple[Array, Array]: ... + ) -> tuple[IntND, FloatND]: ... +@runtime_checkable class StochasticNextFunction(Protocol): """The function that simulates the next state of a stochastic variable. @@ -186,9 +248,10 @@ class StochasticNextFunction(Protocol): """ - def __call__(self, **kwargs: Array) -> Array: ... + def __call__(self, **kwargs: FloatND | IntND) -> FloatND | IntND: ... +@runtime_checkable class NextStateSimulationFunction(Protocol): """The function that computes the next states during the simulation. @@ -199,17 +262,25 @@ class NextStateSimulationFunction(Protocol): def __call__( self, - **kwargs: Array | Period | Age, + **kwargs: FloatND | IntND | Period | Age | MappingLeaf | SequenceLeaf, ) -> MappingProxyType[ RegimeName, MappingProxyType[str, DiscreteState | ContinuousState] ]: ... +@runtime_checkable class ActiveFunction(Protocol): """Function that determines if a regime is active at a given age. + The single positional argument is the age value emitted by the + `AgeGrid`; its runtime type is `int` for annual grids and `float` + for sub-annual ones. The argument is typed as `Any` so model + authors can pin the annotation to whichever concrete type matches + their grid (`int` or `float`) without tripping contravariance + checks at the assignment site. + Only used for type checking. """ - def __call__(self, age: float, /) -> bool: ... + def __call__(self, age: Any, /) -> bool: ... # noqa: ANN401 diff --git a/src/lcm/utils/containers.py b/src/lcm/utils/containers.py index 0c1682d14..346ebe88d 100644 --- a/src/lcm/utils/containers.py +++ b/src/lcm/utils/containers.py @@ -5,6 +5,8 @@ from types import MappingProxyType from typing import Any, TypeVar, cast +from lcm.params import UserMappingLeaf, UserSequenceLeaf + T = TypeVar("T") @@ -68,11 +70,11 @@ def find_duplicates(*containers: Iterable[T]) -> set[T]: return {v for v, count in counts.items() if count > 1} -def get_field_names_and_values(dc: type) -> MappingProxyType[str, Any]: +def get_field_names_and_values(dc: object) -> MappingProxyType[str, Any]: """Return the fields of a dataclass. Args: - dc: The dataclass to get the fields of. + dc: The dataclass class or instance to get the fields of. Returns: An immutable mapping with the field names as keys and the field values as @@ -80,7 +82,10 @@ def get_field_names_and_values(dc: type) -> MappingProxyType[str, Any]: """ return MappingProxyType( - {field.name: getattr(dc, field.name, None) for field in fields(dc)} + { + field.name: getattr(dc, field.name, None) + for field in fields(dc) # ty: ignore[invalid-argument-type] + } ) @@ -118,10 +123,7 @@ def first_non_none(*args: T | None) -> T: def _make_immutable(value: Any) -> Any: # noqa: ANN401 """Recursively convert a value to its immutable equivalent.""" - from lcm.params import MappingLeaf # noqa: PLC0415 - from lcm.params.sequence_leaf import SequenceLeaf # noqa: PLC0415 - - if isinstance(value, (MappingLeaf, SequenceLeaf)): + if isinstance(value, (UserMappingLeaf, UserSequenceLeaf)): return value # already immutable by construction if isinstance(value, (MappingProxyType, tuple, frozenset)): return value @@ -136,12 +138,9 @@ def _make_immutable(value: Any) -> Any: # noqa: ANN401 def _make_mutable(value: Any) -> Any: # noqa: ANN401, PLR0911 """Recursively convert a value to its mutable equivalent.""" - from lcm.params import MappingLeaf # noqa: PLC0415 - from lcm.params.sequence_leaf import SequenceLeaf # noqa: PLC0415 - - if isinstance(value, MappingLeaf): + if isinstance(value, UserMappingLeaf): return {k: _make_mutable(v) for k, v in value.data.items()} - if isinstance(value, SequenceLeaf): + if isinstance(value, UserSequenceLeaf): return [_make_mutable(v) for v in value.data] if isinstance(value, (set, list)): return value diff --git a/src/lcm/utils/dispatchers.py b/src/lcm/utils/dispatchers.py index 22367d641..6c2b47841 100644 --- a/src/lcm/utils/dispatchers.py +++ b/src/lcm/utils/dispatchers.py @@ -2,14 +2,14 @@ from collections.abc import Callable from functools import partial from types import MappingProxyType -from typing import Literal, TypeVar, cast +from typing import Any, Literal, TypeVar, cast import jax import jax.numpy as jnp -from jax import Array, vmap +from jax import vmap from lcm.exceptions import FunctionDispatchError -from lcm.typing import ActionName, Float1D, FloatND, StateName +from lcm.typing import ActionName, BoolND, FloatND, IntND, StateName from lcm.utils.containers import find_duplicates from lcm.utils.functools import allow_args, allow_only_kwargs @@ -17,10 +17,12 @@ "FunctionWithArrayReturn", bound=Callable[ ..., - Array - | tuple[Array, Array] - | MappingProxyType[str, Array] - | MappingProxyType[str, MappingProxyType[str, Array]], + FloatND + | IntND + | BoolND + | tuple[FloatND | IntND | BoolND, FloatND | IntND | BoolND] + | MappingProxyType[str, FloatND | IntND] + | MappingProxyType[str, MappingProxyType[str, FloatND | IntND]], ], ) @@ -145,17 +147,12 @@ def vmap_1d( in_axes_for_vmap[p] = 0 vmapped = vmap(func, in_axes=in_axes_for_vmap) - vmapped.__signature__ = signature + vmapped.__signature__ = signature # ty: ignore[invalid-assignment] if callable_with == "only_kwargs": out = allow_only_kwargs(vmapped, enforce=False) - elif callable_with == "only_args": - out = vmapped else: - raise ValueError( - f"Invalid callable_with option: {callable_with}. Possible options are " - "('only_args', 'only_kwargs')", - ) + out = vmapped return cast("FunctionWithArrayReturn", out) @@ -242,11 +239,19 @@ def _base_productmap_batched( if param.kind == inspect.Parameter.POSITIONAL_ONLY: raise FunctionDispatchError( "Positional-only parameters are not allowed in dispatched functions. " - f"The parameter '{name}' to the function {func.__name__} " + f"The parameter '{name}' to the function " + f"{getattr(func, '__name__', repr(func))} " "is POSITIONAL_ONLY." ) - def batched_vmap(**kwargs: FloatND) -> FloatND: + def batched_vmap(**kwargs: Any) -> Any: # noqa: ANN401 + # `batched_vmap` is a generic helper: it accepts whatever values the + # composed `func` expects (canonical JAX arrays in the production + # pipeline, but also Python scalars, non-canonical-dtype arrays, or + # `MappingProxyType` containers in callers that wrap their own pytrees) + # and returns whatever `func` returns. Beartype shouldn't constrain + # the shape here — the wrapped `func` is responsible for its own + # contract. non_array_kwargs = { key: val for key, val in kwargs.items() if key not in product_axes } @@ -259,8 +264,9 @@ def map_one_more( loop_func: FunctionWithArrayReturn, axis: str ) -> FunctionWithArrayReturn: def func_mapped_over_one_more_axis( - *already_mapped_args: Float1D, **already_mapped_kwargs: Float1D - ) -> FloatND: + *already_mapped_args: Any, # noqa: ANN401 + **already_mapped_kwargs: Any, # noqa: ANN401 + ) -> Any: # noqa: ANN401 return jax.lax.map( lambda axis_i: loop_func( *already_mapped_args, **{axis: axis_i}, **already_mapped_kwargs diff --git a/src/lcm/utils/error_handling.py b/src/lcm/utils/error_handling.py index b9c7e9b25..ffe0c338a 100644 --- a/src/lcm/utils/error_handling.py +++ b/src/lcm/utils/error_handling.py @@ -9,7 +9,6 @@ import jax import jax.numpy as jnp import pandas as pd -from jax import Array from lcm.ages import AgeGrid from lcm.exceptions import ( @@ -23,29 +22,34 @@ FlatRegimeParams, FloatND, InternalParams, + IntND, RegimeName, ScalarFloat, ScalarInt, StateName, + StateOrActionName, ) # Genuine circular import: model.py imports from this module at module level. -# Safe because Model is only used at runtime in validate_transition_probs, -# which is never called during module initialisation. +# The `model` parameter of `validate_transition_probs` is annotated with the +# fully-qualified string `"lcm.model.Model"` so the beartype claw resolves it +# by importing `lcm.model` at first call — long after the import cycle settles +# — rather than at module-init time. Importing `lcm.model` here keeps `lcm` a +# bound name for the type checker. if TYPE_CHECKING: - from lcm.model import Model + import lcm.model def validate_V( *, - V_arr: Array, + V_arr: FloatND, age: float | ScalarInt | ScalarFloat, regime_name: RegimeName | None = None, partial_solution: object = None, compute_intermediates: Callable | None = None, state_action_space: StateActionSpace | None = None, - next_regime_to_V_arr: MappingProxyType | None = None, - internal_params: Mapping | None = None, + next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND] | None = None, + internal_params: FlatRegimeParams | None = None, period: int | None = None, ) -> None: """Validate the value function array for NaN values. @@ -128,8 +132,8 @@ def _enrich_with_diagnostics( exc: InvalidValueFunctionError, compute_intermediates: Callable, state_action_space: StateActionSpace, - next_regime_to_V_arr: MappingProxyType | None, - internal_params: Mapping | None, + next_regime_to_V_arr: MappingProxyType[RegimeName, FloatND] | None, + internal_params: FlatRegimeParams | None, regime_name: RegimeName, age: float, period: int | None, @@ -284,12 +288,13 @@ def _format_diagnostic_summary(summary: dict[str, Any]) -> str: def validate_regime_transition_probs( *, - regime_transition_probs: MappingProxyType[str, Array], + regime_transition_probs: MappingProxyType[RegimeName, FloatND], active_regimes_next_period: tuple[RegimeName, ...], regime_name: RegimeName, age: float | ScalarInt | ScalarFloat, next_age: float | ScalarInt | ScalarFloat, - state_action_values: MappingProxyType[str, Array] | None = None, + state_action_values: MappingProxyType[StateOrActionName, FloatND | IntND] + | None = None, ) -> None: """Validate regime transition probabilities. @@ -352,8 +357,9 @@ def validate_regime_transition_probs( def _format_sum_violation( *, - sum_all: Array, - state_action_values: MappingProxyType[str, Array] | None = None, + sum_all: FloatND, + state_action_values: MappingProxyType[StateOrActionName, FloatND | IntND] + | None = None, ) -> str: """Format a human-readable description of probability sum violations. @@ -480,7 +486,7 @@ def _validate_regime_transition_single( filtered_params = {k: v for k, v in regime_params.items() if k in accepted_params} # Collect only grid variables the transition function accepts - grids: dict[str, Array] = { + grids: dict[StateOrActionName, FloatND | IntND] = { k: v for k, v in state_action_space.states.items() if k in accepted_params } | {k: v for k, v in state_action_space.actions.items() if k in accepted_params} @@ -488,36 +494,40 @@ def _validate_regime_transition_single( grid_var_names = list(grids.keys()) grid_arrays = list(grids.values()) + # Pin to int32: a Python-int `period` traced through `jax.vmap` becomes + # int64 under x64, breaking any int32 `period` contract downstream. + period_int32 = jnp.int32(period) + if grid_arrays: mesh = jnp.meshgrid(*grid_arrays, indexing="ij") flat_arrays = [m.ravel() for m in mesh] def _call( - *args: Array, + *args: FloatND | IntND, _names: list[str] = grid_var_names, _params: dict = filtered_params, _func: object = regime_transition_func, - _period: int = period, + _period: ScalarInt = period_int32, _age: ScalarInt | ScalarFloat = ages.values[period], # noqa: PD011 - ) -> MappingProxyType[str, Array]: + ) -> MappingProxyType[RegimeName, FloatND]: kwargs = dict(zip(_names, args, strict=True)) return _func( # ty: ignore[call-non-callable] **kwargs, **_params, period=_period, age=_age ) - regime_transition_probs: MappingProxyType[str, Array] = jax.vmap(_call)( - *flat_arrays - ) + regime_transition_probs: MappingProxyType[RegimeName, FloatND] = jax.vmap( + _call + )(*flat_arrays) point = dict(zip(grid_var_names, flat_arrays, strict=True)) else: - regime_transition_probs: MappingProxyType[str, Array] = ( # ty: ignore[invalid-assignment] + regime_transition_probs: MappingProxyType[RegimeName, FloatND] = ( regime_transition_func( # ty: ignore[call-non-callable] **filtered_params, - period=period, + period=period_int32, age=ages.values[period], # noqa: PD011 ) ) - point: dict[str, Array] = {} + point: dict[StateOrActionName, FloatND | IntND] = {} validate_regime_transition_probs( regime_transition_probs=regime_transition_probs, @@ -540,7 +550,7 @@ def _call( def _validate_no_reachable_incomplete_targets( *, internal_regimes: MappingProxyType[RegimeName, InternalRegime], - regime_transition_probs: MappingProxyType[str, Array], + regime_transition_probs: MappingProxyType[RegimeName, FloatND], active_regimes_next_period: tuple[RegimeName, ...], regime_name: RegimeName, age: float | ScalarInt | ScalarFloat, @@ -740,7 +750,7 @@ def _extract_bare_names(slice_node: ast.expr) -> list[str] | None: def validate_transition_probs( *, probs: FloatND, - model: Model, + model: lcm.model.Model, regime_name: RegimeName, state_name: StateName, ) -> None: ... @@ -750,7 +760,7 @@ def validate_transition_probs( def validate_transition_probs( *, probs: FloatND, - model: Model, + model: lcm.model.Model, regime_name: RegimeName, state_name: StateName, target_regime_name: RegimeName, @@ -761,7 +771,7 @@ def validate_transition_probs( def validate_transition_probs( *, probs: FloatND, - model: Model, + model: lcm.model.Model, regime_name: RegimeName, ) -> None: ... @@ -769,7 +779,7 @@ def validate_transition_probs( def validate_transition_probs( *, probs: FloatND, - model: Model, + model: lcm.model.Model, regime_name: RegimeName, state_name: StateName | None = None, target_regime_name: RegimeName | None = None, @@ -918,7 +928,7 @@ def _build_expected_shape( indexing_params: list[str], n_outcomes: int, grids: dict[str, DiscreteGrid], - model: Model, + model: lcm.model.Model, ) -> tuple[int, ...]: """Compute expected shape for a transition probability array.""" shape: list[int] = [] diff --git a/src/lcm/utils/functools.py b/src/lcm/utils/functools.py index 1b8ffa2ef..001eb369c 100644 --- a/src/lcm/utils/functools.py +++ b/src/lcm/utils/functools.py @@ -5,6 +5,18 @@ ReturnType = TypeVar("ReturnType") +# `functools.wraps` copies `__annotate__` (PEP 649), which would push the +# wrapped function's per-parameter annotations onto the generic +# `(*args: Any, **kwargs: Any)` wrappers below. Beartype claws those +# wrappers as part of the `lcm` package, sees the inherited annotations, +# and starts enforcing user-model types on a forwarding wrapper that has +# no business policing them. Use a reduced assignment set to keep +# `__name__` / `__qualname__` / `__doc__` for debugging while leaving the +# wrappers' own `(*args: Any, **kwargs: Any)` annotations intact. +_WRAPPER_ASSIGNMENTS_NO_ANNOTATIONS: tuple[str, ...] = tuple( + name for name in functools.WRAPPER_ASSIGNMENTS if name != "__annotate__" +) + def allow_only_kwargs( func: Callable[..., ReturnType], *, enforce: bool = True @@ -34,7 +46,7 @@ def allow_only_kwargs( ] new_signature = signature.replace(parameters=new_parameters) - @functools.wraps(func) + @functools.wraps(func, assigned=_WRAPPER_ASSIGNMENTS_NO_ANNOTATIONS) def func_with_only_kwargs(*args: Any, **kwargs: Any) -> ReturnType: if args: raise ValueError( @@ -119,7 +131,7 @@ def allow_args(func: Callable[..., ReturnType]) -> Callable[..., ReturnType]: ] new_signature = signature.replace(parameters=new_parameters) - @functools.wraps(func) + @functools.wraps(func, assigned=_WRAPPER_ASSIGNMENTS_NO_ANNOTATIONS) def allow_args_wrapper(*args: Any, **kwargs: Any) -> ReturnType: # Check if the total number of arguments matches the function signature if len(args) + len(kwargs) != len(parameters): diff --git a/src/lcm/variables.py b/src/lcm/variables.py index 64eec92cb..81c1fbbbe 100644 --- a/src/lcm/variables.py +++ b/src/lcm/variables.py @@ -27,6 +27,19 @@ from lcm.regime import Regime +def _bind_forward_refs(*, regime_cls: type) -> None: + """Bind `Regime` into this module's globals. + + The package claw rewrites string annotations on `from_regime`, + `get_grids`, and similar helpers into runtime forward references + resolved against this module's globals. `lcm.__init__` calls this + helper once `Regime` is loaded so the refs resolve at call time + without depending on an ad-hoc assignment from outside the module. + """ + global Regime # noqa: PLW0603 + Regime = regime_cls # ty: ignore[invalid-assignment] + + @dataclasses.dataclass(frozen=True) class VariableInfo: """Kind/topology/shock tags for one state or action variable.""" diff --git a/src/lcm_examples/mahler_yum_2024/_model.py b/src/lcm_examples/mahler_yum_2024/_model.py index a237877d9..65c8b79c3 100644 --- a/src/lcm_examples/mahler_yum_2024/_model.py +++ b/src/lcm_examples/mahler_yum_2024/_model.py @@ -308,11 +308,11 @@ def savings_constraint( return net_income + (wealth) * r >= (saving) -def alive_is_active(age: int, final_age_alive: float) -> bool: +def alive_is_active(age: int, final_age_alive: int) -> bool: return age <= final_age_alive -def dead_is_active(age: int, initial_age: float) -> bool: +def dead_is_active(age: int, initial_age: int) -> bool: return age > initial_age @@ -320,7 +320,7 @@ def dead_is_active(age: int, initial_age: float) -> bool: ALIVE_REGIME = Regime( transition=MarkovTransition(next_regime), - active=partial(alive_is_active, final_age_alive=ages.values[-2]), + active=partial(alive_is_active, final_age_alive=int(ages.values[-2])), states={ "wealth": LinSpacedGrid(start=0, stop=49, n_points=50), "health": DiscreteGrid(Health), @@ -382,7 +382,7 @@ def dead_utility(discount_type: DiscreteState) -> FloatND: # noqa: ARG001 DEAD_REGIME = Regime( transition=None, - active=partial(dead_is_active, initial_age=ages.values[0]), + active=partial(dead_is_active, initial_age=int(ages.values[0])), states={ "discount_type": DiscreteGrid(DiscountType), }, diff --git a/tests/data/regression_tests/f32/mahler_yum_simulation.pkl b/tests/data/regression_tests/f32/mahler_yum_simulation.pkl index 3b2191c53..413a1213b 100644 Binary files a/tests/data/regression_tests/f32/mahler_yum_simulation.pkl and b/tests/data/regression_tests/f32/mahler_yum_simulation.pkl differ diff --git a/tests/data/regression_tests/f32/mortality_simulation.pkl b/tests/data/regression_tests/f32/mortality_simulation.pkl index c2c8965f4..123d5f888 100644 Binary files a/tests/data/regression_tests/f32/mortality_simulation.pkl and b/tests/data/regression_tests/f32/mortality_simulation.pkl differ diff --git a/tests/data/regression_tests/f32/precautionary_savings_simulation.pkl b/tests/data/regression_tests/f32/precautionary_savings_simulation.pkl index 71d2a6e5c..fb1e069b9 100644 Binary files a/tests/data/regression_tests/f32/precautionary_savings_simulation.pkl and b/tests/data/regression_tests/f32/precautionary_savings_simulation.pkl differ diff --git a/tests/data/regression_tests/f64/mahler_yum_simulation.pkl b/tests/data/regression_tests/f64/mahler_yum_simulation.pkl index c72a5baae..3a2484840 100644 Binary files a/tests/data/regression_tests/f64/mahler_yum_simulation.pkl and b/tests/data/regression_tests/f64/mahler_yum_simulation.pkl differ diff --git a/tests/data/regression_tests/f64/mortality_simulation.pkl b/tests/data/regression_tests/f64/mortality_simulation.pkl index 257224bee..4c4ffe308 100644 Binary files a/tests/data/regression_tests/f64/mortality_simulation.pkl and b/tests/data/regression_tests/f64/mortality_simulation.pkl differ diff --git a/tests/data/regression_tests/f64/precautionary_savings_simulation.pkl b/tests/data/regression_tests/f64/precautionary_savings_simulation.pkl index b24163be2..3853de29f 100644 Binary files a/tests/data/regression_tests/f64/precautionary_savings_simulation.pkl and b/tests/data/regression_tests/f64/precautionary_savings_simulation.pkl differ diff --git a/tests/data/regression_tests/generate_benchmark_data.py b/tests/data/regression_tests/generate_benchmark_data.py index 748ddd516..b4f4eb4b9 100644 --- a/tests/data/regression_tests/generate_benchmark_data.py +++ b/tests/data/regression_tests/generate_benchmark_data.py @@ -62,7 +62,7 @@ def _generate_precautionary_savings(data_dir: Path) -> None: "age": jnp.full(n_subjects, 20.0), "wealth": jnp.full(n_subjects, 5.0), "income": jnp.full(n_subjects, 0.0), - "regime": jnp.zeros(n_subjects, dtype=jnp.int32), + "regime_id": jnp.zeros(n_subjects, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=12345, @@ -82,7 +82,7 @@ def _generate_mortality(data_dir: Path) -> None: initial_conditions={ "age": jnp.full(n_subjects, 40.0), "wealth": jnp.full(n_subjects, 100.0), - "regime": jnp.zeros(n_subjects, dtype=jnp.int32), + "regime_id": jnp.zeros(n_subjects, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=12345, @@ -102,7 +102,7 @@ def _generate_mahler_yum(data_dir: Path) -> None: params = {"alive": common_params} initial_conditions = { **initial_states, - "regime": jnp.full( + "regime_id": jnp.full( n_subjects, model.regime_names_to_ids["alive"], dtype=jnp.int32, diff --git a/tests/data/regression_tests/simulation.pkl b/tests/data/regression_tests/simulation.pkl index 9dbe57257..305d19b2c 100644 Binary files a/tests/data/regression_tests/simulation.pkl and b/tests/data/regression_tests/simulation.pkl differ diff --git a/tests/data/shocks/simulation_lognormal.pkl b/tests/data/shocks/simulation_lognormal.pkl index 14c501599..efc477579 100644 Binary files a/tests/data/shocks/simulation_lognormal.pkl and b/tests/data/shocks/simulation_lognormal.pkl differ diff --git a/tests/data/shocks/simulation_normal.pkl b/tests/data/shocks/simulation_normal.pkl index 6d5a01f9d..8e9d616c3 100644 Binary files a/tests/data/shocks/simulation_normal.pkl and b/tests/data/shocks/simulation_normal.pkl differ diff --git a/tests/data/shocks/simulation_rouwenhorst.pkl b/tests/data/shocks/simulation_rouwenhorst.pkl index 7dc0961e2..cdb9eafe1 100644 Binary files a/tests/data/shocks/simulation_rouwenhorst.pkl and b/tests/data/shocks/simulation_rouwenhorst.pkl differ diff --git a/tests/data/shocks/simulation_tauchen.pkl b/tests/data/shocks/simulation_tauchen.pkl index 6dbec3bc1..004c24214 100644 Binary files a/tests/data/shocks/simulation_tauchen.pkl and b/tests/data/shocks/simulation_tauchen.pkl differ diff --git a/tests/data/shocks/simulation_uniform.pkl b/tests/data/shocks/simulation_uniform.pkl index aade3cc8a..d4eff882c 100644 Binary files a/tests/data/shocks/simulation_uniform.pkl and b/tests/data/shocks/simulation_uniform.pkl differ diff --git a/tests/regime_building/test_create_regime_params_template.py b/tests/regime_building/test_create_regime_params_template.py index 62d5a5cb4..1f8fa361a 100644 --- a/tests/regime_building/test_create_regime_params_template.py +++ b/tests/regime_building/test_create_regime_params_template.py @@ -19,10 +19,10 @@ def test_create_params_without_shocks(binary_category_class): transition=lambda: 0, functions={"utility": lambda a, b, c: None}, # noqa: ARG005 ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert got == ensure_containers_are_immutable( { - "H": {"discount_factor": "float"}, + "H": {"discount_factor": "FloatND"}, "utility": {"c": "no_annotation_found"}, "next_b": {}, "next_regime": {}, @@ -45,7 +45,7 @@ def custom_H(utility: float, E_next_V: float) -> float: }, functions={"utility": lambda a, b, c: None, "H": custom_H}, # noqa: ARG005 ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert got == ensure_containers_are_immutable( {"H": {}, "utility": {"c": "no_annotation_found"}} ) @@ -67,7 +67,7 @@ def test_default_H_with_state_named_discount_factor_is_allowed(): functions={"utility": lambda a, discount_factor: None}, # noqa: ARG005 transition=lambda discount_factor: discount_factor, ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert got == ensure_containers_are_immutable( { "H": {}, @@ -95,7 +95,7 @@ def custom_H(utility: float, E_next_V: float, wealth: float) -> float: states={"wealth": None}, functions={"utility": lambda a, wealth: None, "H": custom_H}, # noqa: ARG005 ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert got == ensure_containers_are_immutable({"H": {}, "utility": {}}) @@ -124,7 +124,7 @@ def beta_delta_h( "H": SolveSimulateFunctionPair(solve=exponential_h, simulate=beta_delta_h), }, ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert set(got["H"]) == {"discount_factor", "beta", "delta"} @@ -141,10 +141,10 @@ def test_regular_function_taking_state_as_argument_no_error(binary_category_clas transition=lambda: 0, functions={"utility": lambda a, wealth, risk_aversion: None}, # noqa: ARG005 ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert got == ensure_containers_are_immutable( { - "H": {"discount_factor": "float"}, + "H": {"discount_factor": "FloatND"}, "utility": {"risk_aversion": "no_annotation_found"}, "next_wealth": {}, "next_regime": {}, @@ -180,10 +180,10 @@ def next_wealth(wealth: float, next_aime: float) -> float: transition=lambda: 0, functions={"utility": lambda a, wealth, aime: None}, # noqa: ARG005 ) - got = create_regime_params_template(regime) # ty: ignore[invalid-argument-type] + got = create_regime_params_template(regime) assert got == ensure_containers_are_immutable( { - "H": {"discount_factor": "float"}, + "H": {"discount_factor": "FloatND"}, "utility": {}, "next_wealth": {}, "next_aime": {}, diff --git a/tests/regime_building/test_process_params.py b/tests/regime_building/test_process_params.py index 093df0a9d..14afc2e2b 100644 --- a/tests/regime_building/test_process_params.py +++ b/tests/regime_building/test_process_params.py @@ -1,14 +1,23 @@ """Tests for process_params function.""" from types import MappingProxyType +from typing import cast import pytest from lcm.exceptions import InvalidNameError, InvalidParamsError +from lcm.interfaces import InternalRegime from lcm.params.processing import ( create_params_template, process_params, ) +from lcm.typing import ParamsTemplate +from lcm.utils.containers import ensure_containers_are_immutable + + +def _as_template(plain: dict) -> ParamsTemplate: + """Deep-freeze a plain nested dict into a `ParamsTemplate` for tests.""" + return cast("ParamsTemplate", ensure_containers_are_immutable(plain)) def _expected_flat_keys(params_template, regime): @@ -22,16 +31,18 @@ def _expected_flat_keys(params_template, regime): @pytest.fixture def params_template(): """Fixture providing a params_template with two regimes and two functions each.""" - return { - "regime_0": { - "fun_0": {"arg_0": float, "arg_1": float}, - "fun_1": {"arg_0": float, "arg_1": 1.0}, - }, - "regime_1": { - "fun_0": {"arg_0": float, "arg_1": float}, - "fun_1": {"arg_0": float, "arg_1": 1.0}, - }, - } + return _as_template( + { + "regime_0": { + "fun_0": {"arg_0": "float", "arg_1": "float"}, + "fun_1": {"arg_0": "float", "arg_1": "float"}, + }, + "regime_1": { + "fun_0": {"arg_0": "float", "arg_1": "float"}, + "fun_1": {"arg_0": "float", "arg_1": "float"}, + }, + } + ) def test_params_at_function_level(params_template): @@ -164,16 +175,22 @@ def test_ambiguous_model_regime_level(params_template): process_params(params=params, params_template=params_template) -class MockRegime: - """Mock regime with regime_params_template for testing create_params_template.""" +class MockRegime(InternalRegime): + """Mock InternalRegime exposing only `regime_params_template`. - def __init__(self, regime_params_template: dict) -> None: - self._regime_params_template = regime_params_template + Inherits from `InternalRegime` so `isinstance(x, InternalRegime)` + holds at `create_params_template`'s beartype-checked perimeter, but + bypasses `InternalRegime.__init__` to keep test fixtures minimal — + `create_params_template` only reads `regime_params_template`. - @property - def regime_params_template(self) -> MappingProxyType: - """Return regime_params_template as MappingProxyType.""" - return MappingProxyType(self._regime_params_template) + """ + + def __init__(self, regime_params_template: dict) -> None: + object.__setattr__( + self, + "regime_params_template", + MappingProxyType(regime_params_template), + ) def test_function_params_no_qname_separator(): @@ -184,7 +201,7 @@ def test_function_params_no_qname_separator(): ), } with pytest.raises(InvalidNameError): - create_params_template(internal_regimes) # ty: ignore[invalid-argument-type] + create_params_template(MappingProxyType(internal_regimes)) def test_regime_name_no_qname_separator(): @@ -195,7 +212,7 @@ def test_regime_name_no_qname_separator(): ), } with pytest.raises(InvalidNameError): - create_params_template(internal_regimes) # ty: ignore[invalid-argument-type] + create_params_template(MappingProxyType(internal_regimes)) def test_function_name_no_qname_separator(): @@ -206,7 +223,7 @@ def test_function_name_no_qname_separator(): ), } with pytest.raises(InvalidNameError): - create_params_template(internal_regimes) # ty: ignore[invalid-argument-type] + create_params_template(MappingProxyType(internal_regimes)) def test_regime_function_names_disjoint(): @@ -218,7 +235,7 @@ def test_regime_function_names_disjoint(): ), } with pytest.raises(InvalidNameError): - create_params_template(internal_regimes) # ty: ignore[invalid-argument-type] + create_params_template(MappingProxyType(internal_regimes)) def test_regime_argument_names_disjoint(): @@ -230,7 +247,7 @@ def test_regime_argument_names_disjoint(): ), } with pytest.raises(InvalidNameError): - create_params_template(internal_regimes) # ty: ignore[invalid-argument-type] + create_params_template(MappingProxyType(internal_regimes)) def test_missing_parameter_raises_error(params_template): @@ -271,19 +288,21 @@ def test_passing_same_params_to_regimes_with_different_templates(): """ # Template for a non-terminal regime with functions that have parameters alive_template = { - "discount_factor": float, - "utility": {"beta_mean": float, "beta_std": float}, - "cons_util": {"sigma": float, "bb": float, "kappa": float}, - "next_health": {"probs_array": float}, + "H": {"discount_factor": "float"}, + "utility": {"beta_mean": "float", "beta_std": "float"}, + "cons_util": {"sigma": "float", "bb": "float", "kappa": "float"}, + "next_health": {"probs_array": "float"}, } # Template for a terminal regime - empty (no H, no transitions) - dead_template: dict[str, type] = {} + dead_template: dict[str, dict[str, str]] = {} - params_template = { - "alive": alive_template, - "dead": dead_template, - } + params_template = _as_template( + { + "alive": alive_template, + "dead": dead_template, + } + ) # User's shared params dict - has all parameters for the alive regime shared_params = { @@ -303,7 +322,7 @@ def test_passing_same_params_to_regimes_with_different_templates(): # InvalidParamsError is raised because dead__cons_util__*, dead__utility__*, # etc. are not in the template with pytest.raises(InvalidParamsError, match="Unknown keys"): - process_params(params=params, params_template=params_template) # ty: ignore[invalid-argument-type] + process_params(params=params, params_template=params_template) def test_shock_params_via_regular_params(): @@ -313,13 +332,15 @@ def test_shock_params_via_regular_params(): state name (e.g., "adjustment_cost"), so users can pass them via regular params. """ # Template includes ShockGrid params under the state name - params_template = { - "working_life": { - "discount_factor": float, - "utility": {"param": float}, - "adjustment_cost": {"start": float, "stop": float}, - }, - } + params_template = _as_template( + { + "working_life": { + "H": {"discount_factor": "float"}, + "utility": {"param": "float"}, + "adjustment_cost": {"start": "float", "stop": "float"}, + }, + } + ) params = { "working_life": { @@ -332,6 +353,6 @@ def test_shock_params_via_regular_params(): }, } - result = process_params(params=params, params_template=params_template) # ty: ignore[invalid-argument-type] + result = process_params(params=params, params_template=params_template) assert result["working_life"]["adjustment_cost__start"] == 0 assert result["working_life"]["adjustment_cost__stop"] == 1 diff --git a/tests/regime_building/test_regime_processing.py b/tests/regime_building/test_regime_processing.py index 7c60a9a51..aa3357fef 100644 --- a/tests/regime_building/test_regime_processing.py +++ b/tests/regime_building/test_regime_processing.py @@ -37,7 +37,7 @@ def next_c(a, b): functions={"utility": utility}, ) - got = Variables.from_regime(regime_mock) # ty: ignore[invalid-argument-type] + got = Variables.from_regime(regime_mock) assert isinstance(got, Variables) assert set(got) == {"a", "c"} @@ -60,7 +60,7 @@ def next_c(a, b): functions={"utility": lambda _c: None}, ) - got = get_grids(regime_mock) # ty: ignore[invalid-argument-type] + got = get_grids(regime_mock) assert isinstance(got["a"], DiscreteGrid) assert got["a"].categories == ("cat0", "cat1") assert got["a"].codes == (0, 1) @@ -95,7 +95,7 @@ def next_state(a, b): functions={"utility": lambda _c: None}, ) - got = get_grids(regime_mock) # ty: ignore[invalid-argument-type] + got = get_grids(regime_mock) assert list(got.keys()) == ["c", "b", "e", "d", "f", "a"] diff --git a/tests/regime_mock.py b/tests/regime_mock.py index 84157d35d..5da6c9138 100644 --- a/tests/regime_mock.py +++ b/tests/regime_mock.py @@ -1,41 +1,67 @@ -from dataclasses import dataclass, field +from types import MappingProxyType from typing import Literal, cast from lcm.grids import Grid from lcm.interfaces import SolveSimulateFunctionPair -from lcm.regime import _default_H +from lcm.regime import Regime, _default_H from lcm.regime_building.validation import collect_state_transitions from lcm.typing import UserFunction -@dataclass -class RegimeMock: +class RegimeMock(Regime): """A regime mock for testing the params_template creation functions. - This dataclass has the same attributes as the Regime dataclass, but does not perform - any checks, which helps us test the params_template creation functions in isolation. + Inherits from `Regime` so `isinstance(x, Regime)` holds at the + beartype-checked perimeter of `create_regime_params_template` and + friends, but bypasses `Regime.__init__`'s validation by writing + fields directly via `object.__setattr__`. Tests use this to supply + partial / loosely-typed configurations that the real `Regime` + constructor would reject. """ - n_periods: int | None = None - actions: dict[str, Grid | None] | None = None - states: dict[str, Grid | None] | None = None - state_transitions: dict[str, UserFunction | None] = field(default_factory=dict) - constraints: dict[str, UserFunction] = field(default_factory=dict) - transition: UserFunction | None = None - functions: dict[str, UserFunction] = field(default_factory=dict) + def __init__( + self, + *, + n_periods: int | None = None, + actions: dict[str, Grid | None] | None = None, + states: dict[str, Grid | None] | None = None, + state_transitions: dict[str, UserFunction | None] | None = None, + constraints: dict[str, UserFunction] | None = None, + transition: UserFunction | None = None, + functions: dict[str, UserFunction] | None = None, + ) -> None: + object.__setattr__(self, "n_periods", n_periods) + object.__setattr__(self, "actions", actions if actions is not None else {}) + object.__setattr__(self, "states", states if states is not None else {}) + object.__setattr__( + self, + "state_transitions", + state_transitions if state_transitions is not None else {}, + ) + object.__setattr__( + self, "constraints", constraints if constraints is not None else {} + ) + object.__setattr__(self, "transition", transition) + object.__setattr__( + self, "functions", functions if functions is not None else {} + ) + # Match Regime's defaults for fields RegimeMock callers don't touch + object.__setattr__(self, "active", lambda _age: True) + object.__setattr__(self, "derived_categoricals", MappingProxyType({})) + object.__setattr__(self, "description", "") + # `Regime.__post_init__` injects the default `H` for non-terminal + # regimes; mirror that here. + if not self.terminal and "H" not in self.functions: + object.__setattr__(self, "functions", {**self.functions, "H": _default_H}) @property def terminal(self) -> bool: return self.transition is None - def __post_init__(self) -> None: - if not self.terminal and "H" not in self.functions: - self.functions = {**self.functions, "H": _default_H} - def get_all_functions( self, phase: Literal["solve", "simulate"] = "solve" - ) -> dict[str, UserFunction]: + ) -> MappingProxyType[str, UserFunction]: """Get all regime functions including utility, constraints, and transitions.""" result: dict[str, UserFunction] = {} for name, func in self.functions.items(): @@ -54,4 +80,4 @@ def get_all_functions( ) if self.transition: result["next_regime"] = self.transition - return result + return MappingProxyType(result) diff --git a/tests/simulation/test_initial_conditions.py b/tests/simulation/test_initial_conditions.py index d54c56db1..2d44a9e35 100644 --- a/tests/simulation/test_initial_conditions.py +++ b/tests/simulation/test_initial_conditions.py @@ -21,8 +21,10 @@ ScalarInt, ) -_ACTIVE = 0 -_TERMINAL = 1 +# Regime-id codes are canonical `int32`; `validate_initial_conditions` is an +# internal function that receives already-canonicalized initial conditions. +_ACTIVE = jnp.int32(0) +_TERMINAL = jnp.int32(1) @pytest.fixture @@ -112,7 +114,7 @@ def test_validate_initial_conditions_valid_input( "age": jnp.array([0.0, 0.0]), "wealth": jnp.array([10.0, 50.0]), "health": jnp.array([0, 1]), - "regime": jnp.array([_ACTIVE, _ACTIVE]), + "regime_id": jnp.array([_ACTIVE, _ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -132,7 +134,7 @@ def test_validate_initial_conditions_missing_state( initial_conditions={ "age": jnp.array([0.0, 0.0]), "wealth": jnp.array([10.0, 50.0]), - "regime": jnp.array([_ACTIVE, _ACTIVE]), + "regime_id": jnp.array([_ACTIVE, _ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -152,7 +154,7 @@ def test_validate_initial_conditions_extra_state( "wealth": jnp.array([10.0]), "health": jnp.array([0]), "unknown": jnp.array([1.0]), - "regime": jnp.array([_ACTIVE]), + "regime_id": jnp.array([_ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -171,7 +173,7 @@ def test_validate_initial_conditions_inconsistent_lengths( "age": jnp.array([0.0, 0.0]), "wealth": jnp.array([10.0, 20.0]), "health": jnp.array([0]), - "regime": jnp.array([_ACTIVE, _ACTIVE]), + "regime_id": jnp.array([_ACTIVE, _ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -190,7 +192,7 @@ def test_validate_initial_conditions_invalid_discrete_value( "age": jnp.array([0.0]), "wealth": jnp.array([10.0]), "health": jnp.array([5]), - "regime": jnp.array([_ACTIVE]), + "regime_id": jnp.array([_ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -209,7 +211,7 @@ def test_validate_initial_conditions_invalid_regime_id( "age": jnp.array([0.0]), "wealth": jnp.array([10.0]), "health": jnp.array([0]), - "regime": jnp.array([99]), + "regime_id": jnp.array([99]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -228,7 +230,7 @@ def test_validate_initial_conditions_invalid_age_values( "age": jnp.array([0.0, 99.0]), "wealth": jnp.array([10.0, 50.0]), "health": jnp.array([0, 1]), - "regime": jnp.array([_ACTIVE, _ACTIVE]), + "regime_id": jnp.array([_ACTIVE, _ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -313,7 +315,7 @@ def test_infeasible_initial_states_detected(): initial_conditions={ "age": jnp.array([0.0]), "wealth": jnp.array([0.25]), - "regime": jnp.array([_working_life]), + "regime_id": jnp.array([_working_life]), }, period_to_regime_to_V_arr=None, ) @@ -339,7 +341,7 @@ def test_on_grid_state_but_combination_infeasible(): initial_conditions={ "age": jnp.array([0.0]), "wealth": jnp.array([0.3]), - "regime": jnp.array([_working_life]), + "regime_id": jnp.array([_working_life]), }, period_to_regime_to_V_arr=None, ) @@ -360,7 +362,7 @@ def test_extrapolated_initial_states_accepted(): initial_conditions={ "age": jnp.array([0.0]), "wealth": jnp.array([1.0]), - "regime": jnp.array([_working_life]), + "regime_id": jnp.array([_working_life]), }, period_to_regime_to_V_arr=None, ) @@ -381,7 +383,7 @@ def test_on_grid_initial_states_accepted(): initial_conditions={ "age": jnp.array([0.0]), "wealth": jnp.array([5.0]), - "regime": jnp.array([_working_life]), + "regime_id": jnp.array([_working_life]), }, period_to_regime_to_V_arr=None, ) @@ -403,7 +405,7 @@ def test_irreg_spaced_grid_with_runtime_points(): params=params, initial_conditions={ "wealth": jnp.array([0.3]), - "regime": jnp.array([_working_life]), + "regime_id": jnp.array([_working_life]), }, period_to_regime_to_V_arr=None, ) @@ -421,7 +423,7 @@ def test_missing_age_error_message( initial_conditions={ "wealth": jnp.array([10.0]), "health": jnp.array([0]), - "regime": jnp.array([_ACTIVE]), + "regime_id": jnp.array([_ACTIVE]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -560,7 +562,7 @@ def test_subject_in_inactive_regime_at_starting_age() -> None: initial_conditions={ "age": jnp.array([0.0]), "wealth": jnp.array([10.0]), - "regime": jnp.array([_dead]), + "regime_id": jnp.array([_dead]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -581,7 +583,7 @@ def test_all_subjects_in_regime_with_fewer_states() -> None: initial_conditions={ "age": jnp.array([2.0, 2.0]), "wealth": jnp.array([10.0, 50.0]), - "regime": jnp.array([_dead, _dead]), + "regime_id": jnp.array([_dead, _dead]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -607,7 +609,7 @@ def test_mixed_regimes_all_union_states_provided() -> None: "age": jnp.array([0.0, 2.0]), "wealth": jnp.array([10.0, 50.0]), "health": jnp.array([0, 0]), - "regime": jnp.array([_alive, _dead]), + "regime_id": jnp.array([_alive, _dead]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -628,7 +630,7 @@ def test_constraint_not_checked_for_unused_regime() -> None: initial_conditions={ "age": jnp.array([2.0]), "wealth": jnp.array([40.0]), - "regime": jnp.array([_dead]), + "regime_id": jnp.array([_dead]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -650,7 +652,7 @@ def test_constraint_checked_for_starting_regime() -> None: initial_conditions={ "age": jnp.array([0.0]), "wealth": jnp.array([40.0]), - "regime": jnp.array([_alive]), + "regime_id": jnp.array([_alive]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, @@ -676,7 +678,7 @@ def test_mixed_regimes_constraint_only_checked_for_starting_regime() -> None: initial_conditions={ "age": jnp.array([0.0, 2.0]), "wealth": jnp.array([40.0, 40.0]), - "regime": jnp.array([_alive, _dead]), + "regime_id": jnp.array([_alive, _dead]), }, internal_regimes=model.internal_regimes, regime_names_to_ids=model.regime_names_to_ids, diff --git a/tests/simulation/test_simulate.py b/tests/simulation/test_simulate.py index 66d62f225..4802f21a8 100644 --- a/tests/simulation/test_simulate.py +++ b/tests/simulation/test_simulate.py @@ -89,14 +89,14 @@ def test_simulate_using_raw_inputs(simulate_inputs): initial_conditions={ "wealth": jnp.array([1.0, 50.400803]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array( + "regime_id": jnp.array( [simulate_inputs["regime_names_to_ids"]["working_life"]] * 2 ), }, logger=get_logger(log_level="off"), **simulate_inputs, ) - got = result.to_dataframe().query('regime == "working_life"') + got = result.to_dataframe().query('regime_name == "working_life"') assert (got["labor_supply"] == "retire").all() assert_array_almost_equal(got["consumption"], [1.0, 50.400803]) @@ -148,12 +148,12 @@ def test_simulate_using_model_methods( initial_conditions={ "wealth": jnp.array([20.0, 150, 250, 320]), "age": jnp.array([18.0, 18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 4), + "regime_id": jnp.array([RegimeId.working_life] * 4), }, ) df = result.to_dataframe( additional_targets=["utility", "borrowing_constraint"] - ).query('regime == "working_life"') + ).query('regime_name == "working_life"') # Check expected columns expected_cols = { @@ -166,7 +166,7 @@ def test_simulate_using_model_methods( "utility", "borrowing_constraint", "subject_id", - "regime", + "regime_name", } assert expected_cols == set(df.columns) @@ -194,18 +194,18 @@ def test_simulate_with_only_discrete_actions(): ) model = get_model(n_periods=3) - params = get_params(n_periods=3, wage=1.5, discount_factor=1, interest_rate=0) + params = get_params(n_periods=3, wage=1.5, discount_factor=1.0, interest_rate=0.0) result = model.simulate( params=params, initial_conditions={ - "wealth": jnp.array([0, 2]), + "wealth": jnp.array([0.0, 2.0]), "age": jnp.array([50.0, 50.0]), - "regime": jnp.array([DiscreteRegimeId.working_life] * 2), + "regime_id": jnp.array([DiscreteRegimeId.working_life] * 2), }, period_to_regime_to_V_arr=None, ) - got = result.to_dataframe().query('regime == "working_life"') + got = result.to_dataframe().query('regime_name == "working_life"') # Expected: sorted by (subject_id, period) # Subject 0: wealth=low -> works, low consumption; wealth=high -> retires, high @@ -265,12 +265,12 @@ def test_effect_of_discount_factor_on_last_period(): initial_conditions={ "wealth": initial_wealth, "age": jnp.array([18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 3), + "regime_id": jnp.array([RegimeId.working_life] * 3), }, period_to_regime_to_V_arr=None, ) .to_dataframe() - .query('regime == "working_life"') + .query('regime_name == "working_life"') ) df_high = ( @@ -279,12 +279,12 @@ def test_effect_of_discount_factor_on_last_period(): initial_conditions={ "wealth": initial_wealth, "age": jnp.array([18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 3), + "regime_id": jnp.array([RegimeId.working_life] * 3), }, period_to_regime_to_V_arr=None, ) .to_dataframe() - .query('regime == "working_life"') + .query('regime_name == "working_life"') ) # Higher beta (more patient) should lead to higher value in later periods @@ -330,12 +330,12 @@ def test_effect_of_disutility_of_work(): initial_conditions={ "wealth": initial_wealth, "age": jnp.array([18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 3), + "regime_id": jnp.array([RegimeId.working_life] * 3), }, period_to_regime_to_V_arr=None, ) .to_dataframe() - .query('regime == "working_life"') + .query('regime_name == "working_life"') ) df_high = ( @@ -344,12 +344,12 @@ def test_effect_of_disutility_of_work(): initial_conditions={ "wealth": initial_wealth, "age": jnp.array([18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 3), + "regime_id": jnp.array([RegimeId.working_life] * 3), }, period_to_regime_to_V_arr=None, ) .to_dataframe() - .query('regime == "working_life"') + .query('regime_name == "working_life"') ) # Merge results for easy comparison @@ -377,14 +377,14 @@ def test_to_dataframe_use_labels_parameter(): initial_conditions={ "wealth": jnp.array([20.0, 50.0]), "age": jnp.array([18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 2), + "regime_id": jnp.array([RegimeId.working_life] * 2), }, period_to_regime_to_V_arr=None, ) # use_labels=True (default): discrete columns are Categorical with string labels df_labels = result.to_dataframe() - for col in ["regime", "labor_supply"]: + for col in ["regime_name", "labor_supply"]: assert df_labels[col].dtype.name == "category", f"{col} should be categorical" assert set(df_labels["labor_supply"].cat.categories) == {"work", "retire"} @@ -405,7 +405,7 @@ def regression_simulation_result(): initial_conditions={ "wealth": jnp.array([20.0, 50.0]), "age": jnp.array([18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 2), + "regime_id": jnp.array([RegimeId.working_life] * 2), }, period_to_regime_to_V_arr=None, ) @@ -450,7 +450,7 @@ def test_additional_targets_all_with_stochastic_transitions(): "health": jnp.array([Health.good, Health.bad]), "partner": jnp.array([PartnerStatus.single, PartnerStatus.partnered]), "age": jnp.array([40.0, 40.0]), - "regime": jnp.array([StochasticRegimeId.working_life] * 2), + "regime_id": jnp.array([StochasticRegimeId.working_life] * 2), }, period_to_regime_to_V_arr=None, ) @@ -468,7 +468,7 @@ def test_additional_targets_all_with_stochastic_transitions(): def test_retrieve_actions(): got = _lookup_values_from_indices( - flat_indices=jnp.array([0, 3, 7]), + flat_indices=jnp.array([0, 3, 7], dtype=jnp.int32), grids=MappingProxyType( {"a": jnp.linspace(0, 1, 5), "b": jnp.linspace(10, 20, 6)} ), @@ -488,7 +488,7 @@ def test_simulation_result_pickle_roundtrip(tmp_path: Path): initial_conditions={ "wealth": jnp.array([20.0, 50.0]), "age": jnp.array([18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 2), + "regime_id": jnp.array([RegimeId.working_life] * 2), }, period_to_regime_to_V_arr=None, ) diff --git a/tests/simulation/test_simulate_aot.py b/tests/simulation/test_simulate_aot.py index 698256e4e..ee63aac17 100644 --- a/tests/simulation/test_simulate_aot.py +++ b/tests/simulation/test_simulate_aot.py @@ -21,6 +21,7 @@ from lcm import Model from lcm.ages import AgeGrid +from lcm.exceptions import ModelInitializationError from tests.test_models.deterministic.regression import ( RegimeId, dead, @@ -51,7 +52,7 @@ def _build_initial_conditions(*, n_subjects: int) -> dict[str, Array]: return { "wealth": wealths, "age": jnp.full((n_subjects,), 18.0), - "regime": jnp.array([RegimeId.working_life] * n_subjects), + "regime_id": jnp.array([RegimeId.working_life] * n_subjects), } @@ -63,8 +64,8 @@ def test_n_subjects_validation_rejects_non_positive(invalid: int) -> None: def test_n_subjects_validation_rejects_non_int() -> None: - """`Model(n_subjects=1.5)` raises `TypeError`.""" - with pytest.raises(TypeError, match="n_subjects"): + """`Model(n_subjects=1.5)` raises `ModelInitializationError`.""" + with pytest.raises(ModelInitializationError, match="n_subjects"): _build_test_model(n_periods=3, n_subjects=1.5) # ty: ignore[invalid-argument-type] diff --git a/tests/solution/test_beta_delta.py b/tests/solution/test_beta_delta.py index d36b3d898..bcaaafc0f 100644 --- a/tests/solution/test_beta_delta.py +++ b/tests/solution/test_beta_delta.py @@ -185,7 +185,7 @@ def test_beta_delta_consumption(label, beta, delta): initial_conditions = { "age": initial_age, "wealth": initial_wealth, - "regime": jnp.array([RegimeId.working]), + "regime_id": jnp.array([RegimeId.working]), } if label == "naive_phase_variant": @@ -227,7 +227,7 @@ def test_beta_delta_consumption(label, beta, delta): period_to_regime_to_V_arr=None, ) - df = result.to_dataframe().query('regime == "working"') + df = result.to_dataframe().query('regime_name == "working"') got_c0 = df.loc[df["age"] == 0, "consumption"].iloc[0] got_c1 = df.loc[df["age"] == 1, "consumption"].iloc[0] diff --git a/tests/solution/test_solve_brute.py b/tests/solution/test_solve_brute.py index 5051c751c..3151e9e7a 100644 --- a/tests/solution/test_solve_brute.py +++ b/tests/solution/test_solve_brute.py @@ -7,7 +7,7 @@ from lcm.ages import AgeGrid from lcm.grids import Grid -from lcm.interfaces import StateActionSpace +from lcm.interfaces import InternalRegime, StateActionSpace from lcm.regime_building.max_Q_over_a import get_max_Q_over_a from lcm.regime_building.ndimage import map_coordinates from lcm.solution.solve_brute import solve @@ -23,21 +23,30 @@ class SolveFunctionsMock: compute_intermediates: dict = dataclasses.field(default_factory=dict) -@dataclasses.dataclass(frozen=True) -class InternalRegimeMock: +class InternalRegimeMock(InternalRegime): """Mock InternalRegime with only the attributes required by solve(). - The solve() function only accesses: - - _base_state_action_space: StateActionSpace object - - state_action_space(): method returning the state-action space - - solve_functions.max_Q_over_a: dict mapping period to max_Q_over_a function - - active_periods: list of periods the regime is active + Inherits from `InternalRegime` so `isinstance(x, InternalRegime)` holds at + the beartype-checked perimeter of `solve()`, but bypasses the dataclass + `__init__` so tests can supply only the attributes `solve()` reads: + - `_base_state_action_space`: StateActionSpace object + - `state_action_space()`: method returning the state-action space + - `solve_functions.max_Q_over_a`: dict mapping period to max_Q_over_a function + - `active_periods`: list of periods the regime is active """ - _base_state_action_space: StateActionSpace - solve_functions: SolveFunctionsMock - active_periods: list[int] - grids: MappingProxyType[StateOrActionName, Grid] + def __init__( + self, + *, + _base_state_action_space: StateActionSpace, + solve_functions: SolveFunctionsMock, + active_periods: list[int], + grids: MappingProxyType[StateOrActionName, Grid], + ) -> None: + object.__setattr__(self, "_base_state_action_space", _base_state_action_space) + object.__setattr__(self, "solve_functions", solve_functions) + object.__setattr__(self, "active_periods", active_periods) + object.__setattr__(self, "grids", grids) def state_action_space(self, regime_params): # noqa: ARG002 return self._base_state_action_space @@ -134,7 +143,7 @@ def _Q_and_F( solution = solve( internal_params=MappingProxyType({"default": internal_params}), ages=AgeGrid(start=0, stop=2, step="Y"), - internal_regimes={"default": internal_regime}, # ty: ignore[invalid-argument-type] + internal_regimes=MappingProxyType({"default": internal_regime}), logger=get_logger(log_level="off"), enable_jit=False, ) @@ -195,7 +204,7 @@ def _Q_and_F(a, c, b, d, next_regime_to_V_arr, period, age): # noqa: ARG001 got = solve( internal_params=MappingProxyType({"default": MappingProxyType({})}), ages=AgeGrid(start=0, stop=2, step="Y"), - internal_regimes={"default": internal_regime}, # ty: ignore[invalid-argument-type] + internal_regimes=MappingProxyType({"default": internal_regime}), logger=get_logger(log_level="off"), enable_jit=False, ) diff --git a/tests/test_ages.py b/tests/test_ages.py index 62e9b7cf1..d80d1cc3f 100644 --- a/tests/test_ages.py +++ b/tests/test_ages.py @@ -150,7 +150,7 @@ def test_model_with_quarterly_steps(): initial_conditions={ "wealth": jnp.array([50.0, 100.0, 150.0]), "age": jnp.array([18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 3), + "regime_id": jnp.array([RegimeId.working_life] * 3), }, period_to_regime_to_V_arr=None, ) @@ -161,7 +161,7 @@ def test_model_with_quarterly_steps(): assert set(df["age"].unique()) == {18.0, 18.25, 18.5, 18.75, 19.0} # Check working/retired regimes only have ages < 19 - non_dead_df = df.query('regime != "dead"') + non_dead_df = df.query('regime_name != "dead"') assert all(non_dead_df["age"] < 19) @@ -293,7 +293,7 @@ def test_model_with_integer_ages(): initial_conditions={ "wealth": jnp.array([50.0, 100.0, 150.0]), "age": jnp.array([40, 40, 40]), - "regime": jnp.array([RegimeId.working_life] * 3), + "regime_id": jnp.array([RegimeId.working_life] * 3), }, period_to_regime_to_V_arr=None, ) diff --git a/tests/test_argmax.py b/tests/test_argmax.py index 7ef50c6e1..5fb14d9e7 100644 --- a/tests/test_argmax.py +++ b/tests/test_argmax.py @@ -13,7 +13,7 @@ def test_argmax_1d_with_mask(): - a = jnp.arange(10) + a = jnp.arange(10, dtype=jnp.int32) mask = jnp.array([1, 0, 0, 1, 1, 0, 0, 0, 0, 0], dtype=bool) _argmax, _max = jitted_argmax(a, where=mask, initial=-1) assert _argmax == 4 @@ -21,7 +21,7 @@ def test_argmax_1d_with_mask(): def test_argmax_2d_with_mask(): - a = jnp.arange(10).reshape(2, 5) + a = jnp.arange(10, dtype=jnp.int32).reshape(2, 5) mask = jnp.array([1, 0, 0, 1, 1, 0, 0, 0, 0, 0], dtype=bool).reshape(a.shape) _argmax, _max = jitted_argmax(a, axis=None, where=mask, initial=-1) @@ -38,14 +38,14 @@ def test_argmax_2d_with_mask(): def test_argmax_1d_no_mask(): - a = jnp.arange(10) + a = jnp.arange(10, dtype=jnp.int32) _argmax, _max = jitted_argmax(a) assert _argmax == 9 assert _max == 9 def test_argmax_2d_no_mask(): - a = jnp.arange(10).reshape(2, 5) + a = jnp.arange(10, dtype=jnp.int32).reshape(2, 5) _argmax, _max = jitted_argmax(a, axis=None) assert _argmax == 9 @@ -65,7 +65,7 @@ def test_argmax_2d_no_mask(): def test_argmax_3d_no_mask(): - a = jnp.arange(24).reshape(2, 3, 4) + a = jnp.arange(24, dtype=jnp.int32).reshape(2, 3, 4) _argmax, _max = jitted_argmax(a, axis=None) assert _argmax == 23 @@ -107,37 +107,37 @@ def test_argmax_with_ties(): def test_move_axes_to_back_1d(): - a = jnp.arange(4) + a = jnp.arange(4, dtype=jnp.int32) got = _move_axes_to_back(a, axes=(0,)) assert_array_equal(got, a) def test_move_axes_to_back_2d(): - a = jnp.arange(4).reshape(2, 2) + a = jnp.arange(4, dtype=jnp.int32).reshape(2, 2) got = _move_axes_to_back(a, axes=(0,)) assert_array_equal(got, a.transpose(1, 0)) def test_move_axes_to_back_3d(): # 2 dimensions in back - a = jnp.arange(8).reshape(2, 2, 2) + a = jnp.arange(8, dtype=jnp.int32).reshape(2, 2, 2) got = _move_axes_to_back(a, axes=(0, 1)) assert_array_equal(got, a.transpose(2, 0, 1)) # 2 dimensions in front - a = jnp.arange(8).reshape(2, 2, 2) + a = jnp.arange(8, dtype=jnp.int32).reshape(2, 2, 2) got = _move_axes_to_back(a, axes=(1,)) assert_array_equal(got, a.transpose(0, 2, 1)) def test_flatten_last_n_axes_1d(): - a = jnp.arange(4) + a = jnp.arange(4, dtype=jnp.int32) got = _flatten_last_n_axes(a, n=1) assert_array_equal(got, a) def test_flatten_last_n_axes_2d(): - a = jnp.arange(4).reshape(2, 2) + a = jnp.arange(4, dtype=jnp.int32).reshape(2, 2) got = _flatten_last_n_axes(a, n=1) assert_array_equal(got, a) @@ -147,7 +147,7 @@ def test_flatten_last_n_axes_2d(): def test_flatten_last_n_axes_3d(): - a = jnp.arange(8).reshape(2, 2, 2) + a = jnp.arange(8, dtype=jnp.int32).reshape(2, 2, 2) got = _flatten_last_n_axes(a, n=1) assert_array_equal(got, a) diff --git a/tests/test_beartype_claw.py b/tests/test_beartype_claw.py new file mode 100644 index 000000000..6aae29229 --- /dev/null +++ b/tests/test_beartype_claw.py @@ -0,0 +1,139 @@ +"""The beartype claw is live on the entire `lcm` package. + +The claw uses `INTERNAL_CONF`, so type violations in internal helpers +surface as beartype's own `BeartypeCallHintViolation`. User-facing +constructors (`Model`, `Regime`, `MarkovTransition`, every grid and shock, +`@categorical`, `as_leaf`) carry their own explicit `@beartype(conf=...)` +decorators that map violations to the relevant project exception +(`ModelInitializationError`, `RegimeInitializationError`, +`GridInitializationError`, `InvalidParamsError`); those decorators stack +on top of the claw and win at the user boundary. + +Each `test_claw_checks_*` test calls an internal function with one argument +of the wrong type, chosen so the call would return cleanly if the function +were *not* instrumented — the violation is what proves the claw is +installed. Each `test_*_with_bad_arg_raises_project_exception` test +confirms that an ill-typed argument to a public constructor surfaces as +the project exception, not as `BeartypeCallHintViolation`. +""" + +from types import MappingProxyType + +import jax.numpy as jnp +import numpy as np +import pytest +from beartype.roar import BeartypeCallHintViolation + +from lcm import AgeGrid, LinSpacedGrid, Model, Regime +from lcm.exceptions import ( + GridInitializationError, + ModelInitializationError, + RegimeInitializationError, +) +from lcm.interfaces import _build_regime_sharding +from lcm.model import _validate_log_args +from lcm.regime import _default_H +from lcm.simulation.simulate import _compute_starting_periods +from lcm.solution.solve_brute import _log_per_period_stats +from lcm.state_action_space import _validate_all_states_present +from lcm.utils.error_handling import validate_regime_transition_probs + + +def test_claw_checks_lcm_simulation() -> None: + """Type-violating arguments to internal `lcm.simulation` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + _compute_starting_periods( + initial_ages=np.array([25.0]), # ty: ignore[invalid-argument-type] + ages=AgeGrid(start=25, stop=75, step="Y"), + ) + + +def test_claw_checks_lcm_solution() -> None: + """Type-violating arguments to internal `lcm.solution` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + _log_per_period_stats( + logger="not a logger", # ty: ignore[invalid-argument-type] + diagnostic_rows=[], + mins=jnp.array([]), + maxs=jnp.array([]), + means=jnp.array([]), + ) + + +def test_claw_checks_lcm_utils_error_handling() -> None: + """Type-violating arguments to `lcm.utils.error_handling` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + validate_regime_transition_probs( + regime_transition_probs={"working": jnp.array([1.0])}, # ty: ignore[invalid-argument-type] + active_regimes_next_period=("working",), + regime_name="working", + age=50.0, + next_age=51.0, + ) + + +def test_claw_checks_lcm_state_action_space() -> None: + """Type-violating arguments to `lcm.state_action_space` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + _validate_all_states_present( + provided_states="", # ty: ignore[invalid-argument-type] + required_state_names=set(), + ) + + +def test_claw_checks_lcm_interfaces() -> None: + """Type-violating arguments to `lcm.interfaces` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + _build_regime_sharding( + grids=MappingProxyType({}), + n_devices="not an int", # ty: ignore[invalid-argument-type] + ) + + +def test_claw_checks_lcm_regime() -> None: + """Type-violating arguments to `lcm.regime` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + _default_H( + utility=np.array([1.0]), # ty: ignore[invalid-argument-type] + E_next_V=jnp.array([1.0]), + discount_factor=jnp.array([0.95]), + ) + + +def test_regime_with_bad_arg_raises_project_exception() -> None: + """A bad `Regime` argument surfaces as `RegimeInitializationError`.""" + with pytest.raises(RegimeInitializationError): + Regime( + transition=None, + states={"wealth": LinSpacedGrid(start=1.0, stop=10.0, n_points=3)}, + functions="not a mapping", # ty: ignore[invalid-argument-type] + ) + + +def test_claw_checks_lcm_model() -> None: + """Type-violating arguments to internal `lcm.model` helpers raise.""" + with pytest.raises(BeartypeCallHintViolation): + _validate_log_args( + log_level="progress", + log_path=123, # ty: ignore[invalid-argument-type] + ) + + +def test_model_with_bad_arg_raises_project_exception() -> None: + """A bad `Model` argument surfaces as `ModelInitializationError`.""" + with pytest.raises(ModelInitializationError): + Model( + ages=AgeGrid(start=25, stop=75, step="Y"), + regimes="not a mapping", # ty: ignore[invalid-argument-type] + regime_id_class=int, + ) + + +def test_linspaced_grid_with_bad_arg_raises_project_exception() -> None: + """A bad `LinSpacedGrid` argument surfaces as `GridInitializationError`.""" + with pytest.raises(GridInitializationError): + LinSpacedGrid( + start="not a number", # ty: ignore[invalid-argument-type] + stop=10.0, + n_points=3, + ) diff --git a/tests/test_chained_state_transitions.py b/tests/test_chained_state_transitions.py index 8bc4dc645..2f22bdac6 100644 --- a/tests/test_chained_state_transitions.py +++ b/tests/test_chained_state_transitions.py @@ -107,7 +107,7 @@ def test_simulate_with_chained_transitions_yields_expected_next_wealth() -> None "age": jnp.array([0.0, 0.0]), "aime": jnp.array([0.0, 1.0]), "wealth": jnp.array([2.0, 3.0]), - "regime": jnp.array([_RegimeId.active, _RegimeId.active]), + "regime_id": jnp.array([_RegimeId.active, _RegimeId.active]), } df = ( @@ -117,7 +117,7 @@ def test_simulate_with_chained_transitions_yields_expected_next_wealth() -> None period_to_regime_to_V_arr=None, ) .to_dataframe() - .query('regime == "active"') + .query('regime_name == "active"') .sort_values(["subject_id", "period"]) .reset_index(drop=True) ) diff --git a/tests/test_dispatchers.py b/tests/test_dispatchers.py index 08b64b266..947acd8b6 100644 --- a/tests/test_dispatchers.py +++ b/tests/test_dispatchers.py @@ -2,6 +2,7 @@ import jax.numpy as jnp import pytest +from beartype.roar import BeartypeCallHintViolation from numpy.testing import assert_array_almost_equal as aaae from lcm.exceptions import FunctionDispatchError @@ -216,13 +217,13 @@ def test_spacemap_all_arguments_mapped( [ ( "Same argument provided more than once in actions or states variables", - ["a", "b"], - ["a", "c", "d"], + ("a", "b"), + ("a", "c", "d"), ), ( "Same argument provided more than once in actions or states variables", - ["a", "a", "b"], - ["c", "d"], + ("a", "a", "b"), + ("c", "d"), ), ], ) @@ -246,15 +247,18 @@ def func(a, b, c): def test_vmap_1d_error(): + def func(a): + return a + with pytest.raises(ValueError, match=r"Same argument provided more than once."): - vmap_1d(func=None, variables=["a", "a"]) # ty: ignore[invalid-argument-type] + vmap_1d(func=func, variables=("a", "a")) def test_vmap_1d_callable_with_only_args(): def func(a): return a - vmapped = vmap_1d(func=func, variables=["a"], callable_with="only_args") # ty: ignore[invalid-argument-type] + vmapped = vmap_1d(func=func, variables=("a",), callable_with="only_args") a = jnp.array([1, 2]) # check that the function works with positional arguments aaae(vmapped(a), a) @@ -270,7 +274,7 @@ def test_vmap_1d_callable_with_only_kwargs(): def func(a): return a - vmapped = vmap_1d(func=func, variables=["a"], callable_with="only_kwargs") # ty: ignore[invalid-argument-type] + vmapped = vmap_1d(func=func, variables=("a",), callable_with="only_kwargs") a = jnp.array([1, 2]) # check that the function works with keyword arguments aaae(vmapped(a=a), a) @@ -283,11 +287,10 @@ def func(a): def test_vmap_1d_callable_with_invalid(): + """`callable_with` rejects anything outside the documented literal options.""" + def func(a): return a - with pytest.raises( - ValueError, - match=r"Invalid callable_with option: invalid. Possible options are", - ): - vmap_1d(func=func, variables=["a"], callable_with="invalid") # ty: ignore[invalid-argument-type] + with pytest.raises(BeartypeCallHintViolation): + vmap_1d(func=func, variables=("a",), callable_with="invalid") # ty: ignore[invalid-argument-type] diff --git a/tests/test_distributed.py b/tests/test_distributed.py index 891a89f24..460fffeae 100644 --- a/tests/test_distributed.py +++ b/tests/test_distributed.py @@ -166,7 +166,7 @@ def test_simulation_running_on_multiple_cpus(correct_distributed_model): "wealth": jnp.full(36, 100.0), "type1": jnp.full(36, 1), "type2": jnp.full(36, 1), - "regime": jnp.zeros(36, dtype=jnp.int32), + "regime_id": jnp.zeros(36, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=12345, @@ -201,7 +201,7 @@ def test_simulation_error_if_not_multiple(correct_distributed_model): "wealth": jnp.full(5, 100.0), "type1": jnp.full(5, 1), "type2": jnp.full(5, 1), - "regime": jnp.zeros(5, dtype=jnp.int32), + "regime_id": jnp.zeros(5, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=12345, diff --git a/tests/test_dtypes.py b/tests/test_dtypes.py index d0083dab0..3fd74a872 100644 --- a/tests/test_dtypes.py +++ b/tests/test_dtypes.py @@ -52,8 +52,8 @@ def test_safe_to_int_dtype_raises_on_array_overflow(): # under `jax_enable_x64=False` and trips JAX's own overflow guard before # `safe_to_int_dtype` ever sees the value. arr = np.asarray([1, 2, 2**32], dtype=np.int64) - with pytest.raises(ValueError, match="regime"): - safe_to_int_dtype(arr, name="regime") + with pytest.raises(ValueError, match="regime_id"): + safe_to_int_dtype(arr, name="regime_id") def test_safe_to_int_dtype_raises_on_underflow(): diff --git a/tests/test_economic_validation.py b/tests/test_economic_validation.py index a3c2a1d36..85ab313b1 100644 --- a/tests/test_economic_validation.py +++ b/tests/test_economic_validation.py @@ -29,7 +29,7 @@ def _simulate(shock_type, *, sigma, rho=0.0, mu=0.0): "wealth": jnp.full(_N_SUBJECTS, 5.0), "income": jnp.full(_N_SUBJECTS, unconditional_mean), "age": jnp.full(_N_SUBJECTS, 20.0), - "regime": jnp.array([RegimeId.alive] * _N_SUBJECTS), + "regime_id": jnp.array([RegimeId.alive] * _N_SUBJECTS), }, period_to_regime_to_V_arr=None, seed=_SEED, @@ -38,7 +38,7 @@ def _simulate(shock_type, *, sigma, rho=0.0, mu=0.0): def _mean_wealth_in_final_alive_period(df): - rows = df[(df["period"] == _N_PERIODS - 2) & (df["regime"] == "alive")] + rows = df[(df["period"] == _N_PERIODS - 2) & (df["regime_name"] == "alive")] assert len(rows) > 0, "No rows in final alive period" return rows["wealth"].mean() @@ -48,7 +48,7 @@ def test_deterministic_when_sigma_zero(shock_type): rho = 0.5 if shock_type in ("rouwenhorst", "tauchen") else 0.0 df = _simulate(shock_type, sigma=_SIGMA_ZERO, rho=rho) - alive_df = df[df["regime"] == "alive"] + alive_df = df[df["regime_name"] == "alive"] for period in alive_df["period"].unique(): period_data = alive_df[alive_df["period"] == period] assert period_data["wealth"].std() == pytest.approx(0, abs=_DETERMINISTIC_ATOL) diff --git a/tests/test_error_handling_invalid_vf.py b/tests/test_error_handling_invalid_vf.py index 9b9fe1d39..e86ba7d2a 100644 --- a/tests/test_error_handling_invalid_vf.py +++ b/tests/test_error_handling_invalid_vf.py @@ -183,7 +183,7 @@ def test_simulate_model_with_nan_value_function_array_raises_error( "wealth": jnp.array([0.9, 1.0]), "health": jnp.array([1.0, 1.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([RegimeId.non_terminal] * 2), + "regime_id": jnp.array([RegimeId.non_terminal] * 2), } with pytest.raises(InvalidValueFunctionError): @@ -202,7 +202,7 @@ def test_simulate_model_with_inf_value_function_array_does_not_raise_error( "wealth": jnp.array([1.5, 2.0]), "health": jnp.array([1.0, 1.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([RegimeId.non_terminal] * 2), + "regime_id": jnp.array([RegimeId.non_terminal] * 2), } # This should not raise an error. Subject 1 (wealth=2.0, health=1.0) triggers the diff --git a/tests/test_fgp_discretization.py b/tests/test_fgp_discretization.py index 103d7fb58..4b2bc3eaa 100644 --- a/tests/test_fgp_discretization.py +++ b/tests/test_fgp_discretization.py @@ -287,7 +287,12 @@ def test_mixture_cdf_spot_check(): """Spot-check mixture CDF against manual scipy-style computation.""" x = jnp.array([0.0, 0.1, -0.1]) got = _mixture_cdf( - x=x, p1=FGP_P1, mu1=FGP_MU1, sigma1=FGP_SIGMA1, mu2=FGP_MU2, sigma2=FGP_SIGMA2 + x=x, + p1=jnp.asarray(FGP_P1), + mu1=jnp.asarray(FGP_MU1), + sigma1=jnp.asarray(FGP_SIGMA1), + mu2=jnp.asarray(FGP_MU2), + sigma2=jnp.asarray(FGP_SIGMA2), ) expected = FGP_P1 * jax_cdf((x - FGP_MU1) / FGP_SIGMA1) + (1 - FGP_P1) * jax_cdf( diff --git a/tests/test_fgp_model.py b/tests/test_fgp_model.py index 0d0edc3ec..301107819 100644 --- a/tests/test_fgp_model.py +++ b/tests/test_fgp_model.py @@ -45,7 +45,7 @@ def _simulate(shock_type): "wealth": jnp.full(_N_SUBJECTS, 5.0), "income": jnp.zeros(_N_SUBJECTS), "age": jnp.full(_N_SUBJECTS, 20.0), - "regime": jnp.array([RegimeId.alive] * _N_SUBJECTS), + "regime_id": jnp.array([RegimeId.alive] * _N_SUBJECTS), }, period_to_regime_to_V_arr=None, seed=_SEED, @@ -92,7 +92,7 @@ def test_model_simulates(shock_type): def test_simulated_income_moments(shock_type): """Simulated income moments are in the right ballpark.""" df = _simulate(shock_type) - alive_df = df[df["regime"] == "alive"] + alive_df = df[df["regime_name"] == "alive"] # Income on the grid should have mean near 0 and std near sigma_y income_vals = alive_df["income"].to_numpy() @@ -109,8 +109,8 @@ def test_rouwenhorst_income_moments_closer_to_theory(): df_r = _simulate("rouwenhorst") df_t = _simulate("tauchen") - r_var = df_r[df_r["regime"] == "alive"]["income"].var() - t_var = df_t[df_t["regime"] == "alive"]["income"].var() + r_var = df_r[df_r["regime_name"] == "alive"]["income"].var() + t_var = df_t[df_t["regime_name"] == "alive"]["income"].var() # Both should be in the right ballpark; Rouwenhorst should be at least as close r_err = abs(r_var - expected_var) diff --git a/tests/test_float_dtype_invariants.py b/tests/test_float_dtype_invariants.py index 7e4f14fca..4b031e50c 100644 --- a/tests/test_float_dtype_invariants.py +++ b/tests/test_float_dtype_invariants.py @@ -1,7 +1,7 @@ """Float dtypes follow `canonical_float_dtype()` across pylcm boundaries.""" from collections.abc import Callable -from types import MappingProxyType +from typing import cast import jax.numpy as jnp import numpy as np @@ -12,13 +12,24 @@ from lcm.params import MappingLeaf from lcm.params.processing import process_params from lcm.params.sequence_leaf import SequenceLeaf -from lcm.simulation.initial_conditions import build_initial_states +from lcm.simulation.initial_conditions import ( + build_initial_states, + canonicalize_initial_conditions, +) +from lcm.typing import ParamsTemplate +from lcm.utils.containers import ensure_containers_are_immutable from tests.test_models.deterministic.regression import ( RegimeId, get_model, get_params, ) + +def _as_template(plain: dict) -> ParamsTemplate: + """Deep-freeze a plain nested dict into a `ParamsTemplate` for tests.""" + return cast("ParamsTemplate", ensure_containers_are_immutable(plain)) + + # These tests deliberately pass `float64` inputs to verify the cast at # the barrier. Re-allow the JAX truncation warning that the # project-wide filter (see `pyproject.toml`) promotes to an error — @@ -28,18 +39,25 @@ ) -def test_build_initial_states_casts_user_float64_to_canonical(x64_disabled: None): - """A float64 continuous initial state lands at `canonical_float_dtype()`.""" +def test_canonicalize_initial_conditions_casts_user_float64_to_canonical( + x64_disabled: None, +): + """A float64 continuous initial state lands at `canonical_float_dtype()`. + + `canonicalize_initial_conditions` is pylcm's simulation input boundary: + user arrays of any dtype are cast to their canonical pylcm dtype before + validation and the simulate stack see them. + """ model = get_model(n_periods=3) - initial_states = { + initial_conditions = { "wealth": np.asarray([20.0, 50.0], dtype=np.float64), "age": np.asarray([18.0, 18.0], dtype=np.float64), } - states_per_regime = build_initial_states( - initial_states=initial_states, # ty: ignore[invalid-argument-type] + canonical = canonicalize_initial_conditions( + initial_conditions=initial_conditions, internal_regimes=model.internal_regimes, ) - assert states_per_regime["working_life"]["wealth"].dtype == canonical_float_dtype() + assert canonical["wealth"].dtype == canonical_float_dtype() def test_build_initial_states_casts_user_int_to_canonical(x64_disabled: None): @@ -94,48 +112,48 @@ def test_process_params_casts_float64_array_to_canonical_under_no_x64( silently truncates to `float32` under no-x64 at construction time, so a JAX-built input would never reach the helper as `float64`. """ - template = MappingProxyType({"regime_a": MappingProxyType({"schedule": "Array"})}) + template = _as_template({"regime_a": {"fun": {"schedule": "Array"}}}) user_params = { - "regime_a": {"schedule": np.asarray([0.1, 0.2, 0.3], dtype=np.float64)} + "regime_a": {"fun": {"schedule": np.asarray([0.1, 0.2, 0.3], dtype=np.float64)}} } out = process_params( - params=user_params, # ty: ignore[invalid-argument-type] - params_template=template, # ty: ignore[invalid-argument-type] + params=user_params, + params_template=template, ) - schedule = out["regime_a"]["schedule"] - assert schedule.dtype == jnp.float32 + schedule = out["regime_a"]["fun__schedule"] + assert schedule.dtype == jnp.float32 # ty: ignore[unresolved-attribute] def test_process_params_casts_python_float_to_canonical(x64_disabled: None): """A Python `float` param leaf is cast to `canonical_float_dtype()`.""" - template = MappingProxyType( - {"regime_a": MappingProxyType({"discount_factor": "float"})} - ) - user_params = {"regime_a": {"discount_factor": 0.95}} + template = _as_template({"regime_a": {"fun": {"discount_factor": "float"}}}) + user_params = {"regime_a": {"fun": {"discount_factor": 0.95}}} out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) - discount_factor = out["regime_a"]["discount_factor"] - np.testing.assert_allclose(float(discount_factor), 0.95, rtol=1e-6) - assert discount_factor.dtype == canonical_float_dtype() + discount_factor = out["regime_a"]["fun__discount_factor"] + np.testing.assert_allclose(float(discount_factor), 0.95, rtol=1e-6) # ty: ignore[invalid-argument-type] + assert discount_factor.dtype == canonical_float_dtype() # ty: ignore[unresolved-attribute] def test_process_params_float_array_overflow_raises_with_qualified_name( x64_disabled: None, ): """An out-of-float32 float64 array raises naming the qualified leaf.""" - template = MappingProxyType({"regime_a": MappingProxyType({"schedule": "Array"})}) - user_params = {"regime_a": {"schedule": np.asarray([0.0, 1e40], dtype=np.float64)}} + template = _as_template({"regime_a": {"fun": {"schedule": "Array"}}}) + user_params = { + "regime_a": {"fun": {"schedule": np.asarray([0.0, 1e40], dtype=np.float64)}} + } with pytest.raises(OverflowError, match="schedule"): process_params( - params=user_params, # ty: ignore[invalid-argument-type] - params_template=template, # ty: ignore[invalid-argument-type] + params=user_params, + params_template=template, ) @@ -152,7 +170,7 @@ def test_simulate_state_pool_dtype_stable_across_periods(x64_disabled: None): initial = { "wealth": jnp.asarray([20.0, 50.0, 80.0]), "age": jnp.asarray([18.0, 18.0, 18.0]), - "regime": jnp.asarray([RegimeId.working_life] * 3), + "regime_id": jnp.asarray([RegimeId.working_life] * 3), } result = model.simulate( @@ -234,27 +252,27 @@ def test_process_params_casts_float_array_inside_mapping_leaf_to_canonical( key: str, x64_disabled: None ): """`MappingLeaf` float arrays land at `canonical_float_dtype()`.""" - template = MappingProxyType( - {"regime_a": MappingProxyType({"sched": "MappingLeaf"})} - ) + template = _as_template({"regime_a": {"fun": {"sched": "MappingLeaf"}}}) user_params = { "regime_a": { - "sched": MappingLeaf( - { - "low": np.asarray([0.1, 0.2], dtype=np.float64), - "high": np.asarray([0.5, 0.7], dtype=np.float64), - } - ) + "fun": { + "sched": MappingLeaf( + { + "low": np.asarray([0.1, 0.2], dtype=np.float64), + "high": np.asarray([0.5, 0.7], dtype=np.float64), + } + ) + } } } out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) assert ( - out["regime_a"]["sched"].data[key].dtype # ty: ignore[unresolved-attribute] + out["regime_a"]["fun__sched"].data[key].dtype # ty: ignore[unresolved-attribute, invalid-argument-type] == jnp.float32 ) @@ -264,26 +282,26 @@ def test_process_params_casts_float_array_inside_sequence_leaf_to_canonical( index: int, x64_disabled: None ): """`SequenceLeaf` float arrays land at `canonical_float_dtype()`.""" - template = MappingProxyType( - {"regime_a": MappingProxyType({"sched": "SequenceLeaf"})} - ) + template = _as_template({"regime_a": {"fun": {"sched": "SequenceLeaf"}}}) user_params = { "regime_a": { - "sched": SequenceLeaf( - [ - np.asarray([0.1, 0.2], dtype=np.float64), - np.asarray([0.5, 0.7], dtype=np.float64), - ] - ) + "fun": { + "sched": SequenceLeaf( + [ + np.asarray([0.1, 0.2], dtype=np.float64), + np.asarray([0.5, 0.7], dtype=np.float64), + ] + ) + } } } out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) assert ( - out["regime_a"]["sched"].data[index].dtype # ty: ignore[unresolved-attribute] + out["regime_a"]["fun__sched"].data[index].dtype # ty: ignore[unresolved-attribute, invalid-argument-type] == jnp.float32 ) diff --git a/tests/test_function_representation.py b/tests/test_function_representation.py index 4c6827a89..9d00c791f 100644 --- a/tests/test_function_representation.py +++ b/tests/test_function_representation.py @@ -58,7 +58,7 @@ def test_function_evaluator_with_one_continuous_variable(): func = partial(evaluator, next_V_arr=next_V_arr) # test the evaluator - got = func(next_wealth=0.5) + got = func(next_wealth=jnp.asarray(0.5)) expected = 0.5 * jnp.pi + 2 assert jnp.allclose(got, expected) @@ -146,8 +146,8 @@ def test_function_evaluator(binary_discrete_grid): out = evaluator( next_retired=1, next_insured=0, - next_wealth=600, - next_human_capital=1.5, + next_wealth=jnp.asarray(600.0), + next_human_capital=jnp.asarray(1.5), next_V_arr=next_V_arr, ) @@ -169,7 +169,7 @@ def test_get_coordinate_finder(): grid=LinSpacedGrid(start=0, stop=10, n_points=21), ) find_coordinate = partial(find_coordinate) - calculated = find_coordinate(wealth=5.75) + calculated = find_coordinate(wealth=jnp.asarray(5.75)) assert calculated == 11.5 @@ -224,7 +224,7 @@ def test_get_function_evaluator_illustrative(): # partial the function values into the evaluator f = partial(evaluator, values_name=values) - got = f(prefix_a=0.25) + got = f(prefix_a=jnp.asarray(0.25)) expected = jnp.pi * 0.25 + 2 assert jnp.allclose(got, expected) @@ -245,10 +245,10 @@ def test_get_coordinate_finder_illustrative(): in_name="a", grid=LinSpacedGrid(start=0, stop=1, n_points=3), ) - assert find_coordinate(a=0) == 0 - assert find_coordinate(a=0.5) == 1 - assert find_coordinate(a=1) == 2 - assert find_coordinate(a=0.25) == 0.5 + assert find_coordinate(a=jnp.asarray(0.0)) == 0 + assert find_coordinate(a=jnp.asarray(0.5)) == 1 + assert find_coordinate(a=jnp.asarray(1.0)) == 2 + assert find_coordinate(a=jnp.asarray(0.25)) == 0.5 @pytest.mark.illustrative @@ -349,9 +349,9 @@ def test_function_evaluator_performs_linear_extrapolation(): func = partial(evaluator, next_V_arr=next_V_arr) # test the evaluator on values outside the grid - wealth_outside_of_grid = [-0.5, 3.5, 10] + wealth_outside_of_grid = [-0.5, 3.5, 10.0] # We expect linear extrapolation expected = jnp.pi * jnp.array(wealth_outside_of_grid) + 2 - got = jnp.array([func(next_wealth=w) for w in wealth_outside_of_grid]) + got = jnp.array([func(next_wealth=jnp.asarray(w)) for w in wealth_outside_of_grid]) assert jnp.allclose(got, expected) diff --git a/tests/test_grids.py b/tests/test_grids.py index ec652503c..2db7c6e61 100644 --- a/tests/test_grids.py +++ b/tests/test_grids.py @@ -252,20 +252,20 @@ class Cat: def test_lin_spaced_grid_rejects_non_numeric_start(): - """Non-numeric `start` is rejected at the boundary cast.""" - with pytest.raises((TypeError, ValueError)): + """Non-numeric `start` raises `GridInitializationError`.""" + with pytest.raises(GridInitializationError, match="start"): LinSpacedGrid(start="a", stop=1, n_points=10) # ty: ignore[invalid-argument-type] def test_lin_spaced_grid_rejects_non_numeric_stop(): - """Non-numeric `stop` is rejected at the boundary cast.""" - with pytest.raises((TypeError, ValueError)): + """Non-numeric `stop` raises `GridInitializationError`.""" + with pytest.raises(GridInitializationError, match="stop"): LinSpacedGrid(start=1, stop="a", n_points=10) # ty: ignore[invalid-argument-type] def test_lin_spaced_grid_rejects_non_numeric_n_points(): - """Non-numeric `n_points` is rejected at the boundary cast.""" - with pytest.raises((TypeError, ValueError)): + """Non-numeric `n_points` raises `GridInitializationError`.""" + with pytest.raises(GridInitializationError, match="n_points"): LinSpacedGrid(start=1, stop=2, n_points="a") # ty: ignore[invalid-argument-type] @@ -363,7 +363,7 @@ def test_irreg_spaced_grid_invalid_too_few_points(): def test_irreg_spaced_grid_invalid_non_numeric(): - with pytest.raises(GridInitializationError, match="must be int or float"): + with pytest.raises(GridInitializationError, match="points"): IrregSpacedGrid(points=(1.0, "a", 3.0)) # ty: ignore[invalid-argument-type] @@ -559,13 +559,13 @@ def test_piecewise_lin_spaced_grid_invalid_numeric_gap(): def test_piecewise_lin_spaced_grid_invalid_not_tuple(): """Pieces must be a tuple.""" - with pytest.raises(GridInitializationError, match="must be a tuple"): + with pytest.raises(GridInitializationError, match="pieces"): PiecewiseLinSpacedGrid(pieces=[Piece(interval="[1, 4]", n_points=3)]) # ty: ignore[invalid-argument-type] def test_piecewise_lin_spaced_grid_invalid_not_piece(): """Each element in pieces must be a Piece object.""" - with pytest.raises(GridInitializationError, match="must be a Piece"): + with pytest.raises(GridInitializationError, match="pieces"): PiecewiseLinSpacedGrid( pieces=({"interval": "[1, 4]", "n_points": 3},) # ty: ignore[invalid-argument-type] ) @@ -753,15 +753,15 @@ def test_piecewise_boundary_conditions(grid_cls, boundary_style: str): expected_coord_at = 5.0 if is_lin else 2.0 # Test value just below boundary -> piece 0 - coord_below = float(grid.get_coordinate(below_boundary)) + coord_below = float(grid.get_coordinate(jnp.asarray(below_boundary))) assert coord_below < expected_coord_at # Test value exactly at boundary - coord_at = float(grid.get_coordinate(boundary)) + coord_at = float(grid.get_coordinate(jnp.asarray(boundary))) assert coord_at == pytest.approx(expected_coord_at) # Test value just above boundary -> piece 1 - coord_above = float(grid.get_coordinate(above_boundary)) + coord_above = float(grid.get_coordinate(jnp.asarray(above_boundary))) assert coord_above > expected_coord_at diff --git a/tests/test_heterogeneous_initial_ages.py b/tests/test_heterogeneous_initial_ages.py index 43a251da5..47cee4356 100644 --- a/tests/test_heterogeneous_initial_ages.py +++ b/tests/test_heterogeneous_initial_ages.py @@ -22,7 +22,7 @@ def test_simulation_with_heterogeneous_initial_ages(): initial_conditions={ "age": jnp.array([40.0, 60.0]), "wealth": jnp.array([50.0, 50.0]), - "regime": jnp.array([RegimeId.working_life] * 2), + "regime_id": jnp.array([RegimeId.working_life] * 2), }, period_to_regime_to_V_arr=None, ) diff --git a/tests/test_int_dtype_invariants.py b/tests/test_int_dtype_invariants.py index 4c31f4864..a84a81fa4 100644 --- a/tests/test_int_dtype_invariants.py +++ b/tests/test_int_dtype_invariants.py @@ -1,6 +1,7 @@ """Integer dtypes are pinned to int32 across pylcm regardless of x64 mode.""" from types import MappingProxyType +from typing import cast import jax.numpy as jnp import numpy as np @@ -17,6 +18,8 @@ build_initial_states, ) from lcm.simulation.transitions import _advance_states_for_subjects +from lcm.typing import ParamsTemplate +from lcm.utils.containers import ensure_containers_are_immutable from tests.test_models.deterministic.regression import ( RegimeId, dead, @@ -25,6 +28,12 @@ working_life, ) + +def _as_template(plain: dict) -> ParamsTemplate: + """Deep-freeze a plain nested dict into a `ParamsTemplate` for tests.""" + return cast("ParamsTemplate", ensure_containers_are_immutable(plain)) + + # These tests deliberately pass `int64` inputs to verify the cast at # the barrier. Re-allow the JAX truncation warning that the # project-wide filter (see `pyproject.toml`) promotes to an error — @@ -105,71 +114,80 @@ def test_advance_states_for_subjects_keeps_same_dtype_round_trip() -> None: def test_process_params_casts_python_int_to_int32() -> None: """A Python `int` param leaf is cast to `jnp.int32`.""" - template = MappingProxyType({"regime_a": MappingProxyType({"final_age": "int"})}) - user_params = {"regime_a": {"final_age": 65}} + template = _as_template({"regime_a": {"fun": {"final_age": "int"}}}) + user_params = {"regime_a": {"fun": {"final_age": 65}}} out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) - final_age = out["regime_a"]["final_age"] - assert int(final_age) == 65 - assert final_age.dtype == jnp.int32 + final_age = out["regime_a"]["fun__final_age"] + assert int(final_age) == 65 # ty: ignore[invalid-argument-type] + assert final_age.dtype == jnp.int32 # ty: ignore[unresolved-attribute] def test_process_params_casts_int64_array_to_int32() -> None: - """A `jnp.int64` array param leaf is normalised to `jnp.int32`.""" - template = MappingProxyType({"regime_a": MappingProxyType({"schedule": "Array"})}) - user_params = {"regime_a": {"schedule": jnp.asarray([0, 1, 2], dtype=jnp.int64)}} + """An `int64` array param leaf is normalised to `jnp.int32`. + + Built with `np.asarray`: a JAX `int64` array is rejected at the beartype + boundary (`_ParamsLeaf` pins JAX integer leaves to `int32`), so the + realistic raw-data path for a wider-dtype input is a numpy array. + """ + template = _as_template({"regime_a": {"fun": {"schedule": "Array"}}}) + user_params = { + "regime_a": {"fun": {"schedule": np.asarray([0, 1, 2], dtype=np.int64)}} + } out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) - schedule = out["regime_a"]["schedule"] - assert schedule.dtype == jnp.int32 + schedule = out["regime_a"]["fun__schedule"] + assert schedule.dtype == jnp.int32 # ty: ignore[unresolved-attribute] def test_process_params_int_array_overflow_raises_with_qualified_name() -> None: """An out-of-int32-range int array surfaces the param's qualified name.""" - template = MappingProxyType({"regime_a": MappingProxyType({"big_param": "Array"})}) + template = _as_template({"regime_a": {"fun": {"big_param": "Array"}}}) # Numpy here: under `jax_enable_x64=False`, `jnp.asarray(..., dtype=int64)` # of an out-of-int32 value raises before our helper sees it. - user_params = {"regime_a": {"big_param": np.asarray([0, 2**40], dtype=np.int64)}} + user_params = { + "regime_a": {"fun": {"big_param": np.asarray([0, 2**40], dtype=np.int64)}} + } with pytest.raises(ValueError, match="big_param"): process_params( - params=user_params, # ty: ignore[invalid-argument-type] - params_template=template, # ty: ignore[invalid-argument-type] + params=user_params, + params_template=template, ) @pytest.mark.parametrize("key", ["low", "high"]) def test_process_params_casts_int_array_inside_mapping_leaf_to_int32(key: str) -> None: """`MappingLeaf` int arrays land at `jnp.int32` after params processing.""" - template = MappingProxyType( - {"regime_a": MappingProxyType({"sched": "MappingLeaf"})} - ) + template = _as_template({"regime_a": {"fun": {"sched": "MappingLeaf"}}}) user_params = { "regime_a": { - "sched": MappingLeaf( - { - "low": jnp.asarray([0, 1], dtype=jnp.int64), - "high": jnp.asarray([10, 20], dtype=jnp.int64), - } - ) + "fun": { + "sched": MappingLeaf( + { + "low": jnp.asarray([0, 1], dtype=jnp.int64), + "high": jnp.asarray([10, 20], dtype=jnp.int64), + } + ) + } } } out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) assert ( - out["regime_a"]["sched"].data[key].dtype # ty: ignore[unresolved-attribute] + out["regime_a"]["fun__sched"].data[key].dtype # ty: ignore[unresolved-attribute, invalid-argument-type] == jnp.int32 ) @@ -179,27 +197,27 @@ def test_process_params_casts_int_array_inside_sequence_leaf_to_int32( index: int, ) -> None: """`SequenceLeaf` int arrays land at `jnp.int32` after params processing.""" - template = MappingProxyType( - {"regime_a": MappingProxyType({"sched": "SequenceLeaf"})} - ) + template = _as_template({"regime_a": {"fun": {"sched": "SequenceLeaf"}}}) user_params = { "regime_a": { - "sched": SequenceLeaf( - [ - jnp.asarray([0, 1], dtype=jnp.int64), - jnp.asarray([10, 20], dtype=jnp.int64), - ] - ) + "fun": { + "sched": SequenceLeaf( + [ + jnp.asarray([0, 1], dtype=jnp.int64), + jnp.asarray([10, 20], dtype=jnp.int64), + ] + ) + } } } out = process_params( params=user_params, - params_template=template, # ty: ignore[invalid-argument-type] + params_template=template, ) assert ( - out["regime_a"]["sched"].data[index].dtype # ty: ignore[unresolved-attribute] + out["regime_a"]["fun__sched"].data[index].dtype # ty: ignore[unresolved-attribute, invalid-argument-type] == jnp.int32 ) @@ -226,11 +244,11 @@ def test_simulate_accepts_int64_regime_initial_condition_and_round_trips() -> No } initial_conditions_int32 = { **common, - "regime": jnp.asarray([RegimeId.working_life] * 4, dtype=jnp.int32), + "regime_id": jnp.asarray([RegimeId.working_life] * 4, dtype=jnp.int32), } initial_conditions_int64 = { **common, - "regime": jnp.asarray([RegimeId.working_life] * 4, dtype=jnp.int64), + "regime_id": jnp.asarray([RegimeId.working_life] * 4, dtype=jnp.int64), } df_int32 = model.simulate( diff --git a/tests/test_mapping_leaf.py b/tests/test_mapping_leaf.py index 2e439ca61..21a3dde5b 100644 --- a/tests/test_mapping_leaf.py +++ b/tests/test_mapping_leaf.py @@ -5,7 +5,14 @@ import jax.numpy as jnp import pytest -from lcm.params import MappingLeaf, SequenceLeaf, as_leaf +from lcm.exceptions import InvalidParamsError +from lcm.params import ( + MappingLeaf, + SequenceLeaf, + UserMappingLeaf, + UserSequenceLeaf, + as_leaf, +) from lcm.utils.containers import ( ensure_containers_are_immutable, ensure_containers_are_mutable, @@ -152,28 +159,36 @@ def test_flatten_regime_namespace_treats_mapping_leaf_as_leaf(): def test_as_leaf_mapping(): + """`as_leaf` of a Mapping returns the boundary `UserMappingLeaf` variant.""" result = as_leaf({"a": 1}) - assert isinstance(result, MappingLeaf) + assert isinstance(result, UserMappingLeaf) + assert not isinstance(result, MappingLeaf) assert result.data == {"a": 1} def test_as_leaf_mapping_proxy(): + """`as_leaf` of a `MappingProxyType` returns the boundary `UserMappingLeaf`.""" result = as_leaf(MappingProxyType({"a": 1})) - assert isinstance(result, MappingLeaf) + assert isinstance(result, UserMappingLeaf) + assert not isinstance(result, MappingLeaf) def test_as_leaf_list(): + """`as_leaf` of a list returns the boundary `UserSequenceLeaf` variant.""" result = as_leaf([1, 2, 3]) - assert isinstance(result, SequenceLeaf) + assert isinstance(result, UserSequenceLeaf) + assert not isinstance(result, SequenceLeaf) assert result.data == (1, 2, 3) def test_as_leaf_tuple(): + """`as_leaf` of a tuple returns the boundary `UserSequenceLeaf` variant.""" result = as_leaf((1, 2)) - assert isinstance(result, SequenceLeaf) + assert isinstance(result, UserSequenceLeaf) + assert not isinstance(result, SequenceLeaf) assert result.data == (1, 2) def test_as_leaf_rejects_int(): - with pytest.raises(TypeError, match="as_leaf"): + with pytest.raises(InvalidParamsError, match="as_leaf"): as_leaf(42) # ty: ignore[no-matching-overload] diff --git a/tests/test_model.py b/tests/test_model.py index 8897fe431..53f5ad910 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -23,7 +23,7 @@ def test_regime_invalid_states(): """Regime rejects non-dict states argument.""" - with pytest.raises(RegimeInitializationError, match="states must be a mapping"): + with pytest.raises(RegimeInitializationError, match="states"): Regime( transition=lambda: 0, states="health", # ty: ignore[invalid-argument-type] @@ -35,7 +35,7 @@ def test_regime_invalid_states(): def test_regime_invalid_actions(): """Regime rejects non-dict actions argument.""" - with pytest.raises(RegimeInitializationError, match="actions must be a mapping"): + with pytest.raises(RegimeInitializationError, match="actions"): Regime( transition=lambda: 0, states={}, @@ -47,9 +47,7 @@ def test_regime_invalid_actions(): def test_regime_invalid_functions(): """Regime rejects non-dict functions argument.""" - with pytest.raises( - RegimeInitializationError, match="functions must each be a mapping" - ): + with pytest.raises(RegimeInitializationError, match="functions"): Regime( transition=lambda: 0, states={}, @@ -61,10 +59,7 @@ def test_regime_invalid_functions(): def test_regime_invalid_functions_values(): """Regime rejects non-callable function values.""" - with pytest.raises( - RegimeInitializationError, - match=r"function values must be a callable, but is 0.", - ): + with pytest.raises(RegimeInitializationError, match="functions"): Regime( states={}, actions={}, @@ -76,9 +71,7 @@ def test_regime_invalid_functions_values(): def test_regime_invalid_functions_keys(): """Regime rejects non-string function keys.""" - with pytest.raises( - RegimeInitializationError, match=r"function keys must be a strings, but is 0." - ): + with pytest.raises(RegimeInitializationError, match="functions"): Regime( states={}, actions={}, @@ -90,9 +83,7 @@ def test_regime_invalid_functions_keys(): def test_regime_invalid_actions_values(): """Regime rejects non-grid action values.""" - with pytest.raises( - RegimeInitializationError, match=r"actions value 0 must be an LCM grid." - ): + with pytest.raises(RegimeInitializationError, match="actions"): Regime( states={}, actions={"exercise": 0}, # ty: ignore[invalid-argument-type] @@ -104,9 +95,7 @@ def test_regime_invalid_actions_values(): def test_regime_invalid_states_values(): """Regime rejects non-grid state values.""" - with pytest.raises( - RegimeInitializationError, match=r"states value 0 must be an LCM grid." - ): + with pytest.raises(RegimeInitializationError, match="states"): Regime( states={"health": 0}, # ty: ignore[invalid-argument-type] actions={}, @@ -118,10 +107,7 @@ def test_regime_invalid_states_values(): def test_regime_invalid_utility(): """Regime rejects non-callable utility argument.""" - with pytest.raises( - RegimeInitializationError, - match=(r"function values must be a callable, but is 0"), - ): + with pytest.raises(RegimeInitializationError, match="functions"): Regime( states={}, actions={}, @@ -151,10 +137,7 @@ def test_regime_overlapping_states_actions(binary_category_class): def test_regime_transition_must_be_callable(): """Regime rejects non-callable transition.""" - with pytest.raises( - RegimeInitializationError, - match="transition must be callable or None", - ): + with pytest.raises(RegimeInitializationError, match="transition"): Regime( states={}, actions={}, diff --git a/tests/test_models/shock_grids.py b/tests/test_models/shock_grids.py index 32f005ce4..6213f8619 100644 --- a/tests/test_models/shock_grids.py +++ b/tests/test_models/shock_grids.py @@ -213,7 +213,7 @@ def get_multi_regime_params( shock_params = _SHOCK_PARAMS[distribution_type] health_probs = jnp.full((2, 2), fill_value=0.5) regime_params = { - "discount_factor": 1, + "discount_factor": 1.0, "next_health": {"probs_array": health_probs}, "income": shock_params, } @@ -240,7 +240,7 @@ def get_params( ): return { "alive": { - "discount_factor": 1, + "discount_factor": 1.0, "next_health": {"probs_array": jnp.full((2, 2), fill_value=0.5)}, "income": _SHOCK_PARAMS[distribution_type], }, diff --git a/tests/test_ndimage.py b/tests/test_ndimage.py index 5bb379086..c4ce07b8f 100644 --- a/tests/test_ndimage.py +++ b/tests/test_ndimage.py @@ -26,7 +26,7 @@ from tests.conftest import DECIMAL_PRECISION, X64_ENABLED # Use 64-bit dtypes when x64 is enabled, 32-bit otherwise -TEST_DTYPES = [np.int64, np.float64] if X64_ENABLED else [np.int32, np.float32] +TEST_DTYPES = [np.int32, np.float64] if X64_ENABLED else [np.int32, np.float32] jax_map_coordinates = partial(jax.scipy.ndimage.map_coordinates, order=1, cval=0) scipy_map_coordinates = partial(scipy.ndimage.map_coordinates, order=1, cval=0) diff --git a/tests/test_ndimage_unit.py b/tests/test_ndimage_unit.py index 516a5aec2..f70903acc 100644 --- a/tests/test_ndimage_unit.py +++ b/tests/test_ndimage_unit.py @@ -12,8 +12,11 @@ def test_map_coordinates_wrong_input_dimensions(): - values = jnp.arange(2) # ndim = 1 - coordinates = [jnp.array([0]), jnp.array([1])] # len = 2 + values = jnp.arange(2, dtype=jnp.int32) # ndim = 1 + coordinates = [ + jnp.array([0], dtype=jnp.int32), + jnp.array([1], dtype=jnp.int32), + ] # len = 2 with pytest.raises(ValueError, match="coordinates must be a sequence of length"): map_coordinates(values, coordinates) @@ -29,7 +32,7 @@ def test_map_coordinates_extrapolation(): def test_nonempty_sum(): - a = jnp.arange(3) + a = jnp.arange(3, dtype=jnp.int32) expected = a + a + a got = _sum_all([a, a, a]) @@ -38,7 +41,7 @@ def test_nonempty_sum(): def test_nonempty_prod(): - a = jnp.arange(3) + a = jnp.arange(3, dtype=jnp.int32) expected = a * a * a got = _multiply_all([a, a, a]) @@ -75,7 +78,7 @@ def test_linear_indices_and_weights_inside_domain(): def test_linear_indices_and_weights_outside_domain(): - coordinates = jnp.array([-1, 2]) + coordinates = jnp.array([-1.0, 2.0]) (idx_low, weight_low), (idx_high, weight_high) = _compute_indices_and_weights( coordinates, input_size=2 diff --git a/tests/test_next_state.py b/tests/test_next_state.py index f89bad620..08f51649b 100644 --- a/tests/test_next_state.py +++ b/tests/test_next_state.py @@ -102,7 +102,7 @@ class MockCategory: def test_create_stochastic_next_func(): - labels = jnp.arange(2) + labels = jnp.arange(2, dtype=jnp.int32) got_func = _create_discrete_stochastic_next_func( target="t", next_state_name="next_a", labels=labels ) diff --git a/tests/test_pandas_utils.py b/tests/test_pandas_utils.py index 17bd50a23..e406e8015 100644 --- a/tests/test_pandas_utils.py +++ b/tests/test_pandas_utils.py @@ -128,11 +128,34 @@ class HealthAlt: _build_discrete_grid_lookup(regimes) +def test_regime_name_column_maps_to_regime_id_codes(): + """`regime_name` column (strings) yields a `regime_id` dict entry of int codes.""" + model = get_basic_model() + df = pd.DataFrame( + { + "regime_name": ["working_life", "retirement"], + "health": ["bad", "good"], + "wealth": [10.0, 50.0], + "age": [25.0, 25.0], + } + ) + conditions = initial_conditions_from_dataframe( + df=df, + regimes=model.regimes, + regime_names_to_ids=model.regime_names_to_ids, + ) + assert jnp.array_equal( + conditions["regime_id"], + jnp.array([BasicRegimeId.working_life, BasicRegimeId.retirement]), + ) + assert "regime_name" not in conditions + + def test_continuous_states_and_age(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life", "working_life"], + "regime_name": ["working_life", "working_life"], "health": ["bad", "good"], "wealth": [10.0, 50.0], "age": [25.0, 35.0], @@ -144,7 +167,7 @@ def test_continuous_states_and_age(): regime_names_to_ids=model.regime_names_to_ids, ) assert jnp.array_equal( - conditions["regime"], + conditions["regime_id"], jnp.array([BasicRegimeId.working_life, BasicRegimeId.working_life]), ) assert jnp.allclose(conditions["wealth"], jnp.array([10.0, 50.0])) @@ -155,7 +178,7 @@ def test_categorical_string_labels(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life", "retirement"], + "regime_name": ["working_life", "retirement"], "health": ["bad", "good"], "wealth": [10.0, 50.0], "age": [25.0, 25.0], @@ -167,7 +190,7 @@ def test_categorical_string_labels(): regime_names_to_ids=model.regime_names_to_ids, ) assert jnp.array_equal( - conditions["regime"], + conditions["regime_id"], jnp.array([BasicRegimeId.working_life, BasicRegimeId.retirement]), ) assert jnp.array_equal(conditions["health"], jnp.array([Health.bad, Health.good])) @@ -178,7 +201,7 @@ def test_categorical_pd_categorical_column(): health_dtype = Health.to_categorical_dtype() # ty: ignore[unresolved-attribute] df = pd.DataFrame( { - "regime": ["working_life", "working_life"], + "regime_name": ["working_life", "working_life"], "health": pd.Categorical(["good", "bad"], dtype=health_dtype), "wealth": [10.0, 50.0], "age": [25.0, 25.0], @@ -196,7 +219,7 @@ def test_multi_regime(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life", "retirement", "working_life"], + "regime_name": ["working_life", "retirement", "working_life"], "health": ["good", "bad", "good"], "wealth": [10.0, 50.0, 30.0], "age": [25.0, 25.0, 25.0], @@ -208,7 +231,7 @@ def test_multi_regime(): regime_names_to_ids=model.regime_names_to_ids, ) assert jnp.array_equal( - conditions["regime"], + conditions["regime_id"], jnp.array( [ BasicRegimeId.working_life, @@ -223,7 +246,7 @@ def test_multi_regime(): def test_missing_regime_column_raises(): model = get_basic_model() df = pd.DataFrame({"wealth": [10.0]}) - with pytest.raises(ValueError, match="'regime' column"): + with pytest.raises(ValueError, match="'regime_name' column"): initial_conditions_from_dataframe( df=df, regimes=model.regimes, @@ -235,7 +258,7 @@ def test_invalid_regime_name_raises(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life", "nonexistent"], + "regime_name": ["working_life", "nonexistent"], "wealth": [10.0, 50.0], } ) @@ -251,7 +274,7 @@ def test_invalid_category_label_raises(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life"], + "regime_name": ["working_life"], "health": ["excellent"], "wealth": [10.0], "age": [25.0], @@ -268,7 +291,7 @@ def test_invalid_category_label_raises(): def test_empty_dataframe_raises(): model = get_basic_model() df = pd.DataFrame( - {"regime": pd.Series([], dtype=str), "wealth": pd.Series([], dtype=float)} + {"regime_name": pd.Series([], dtype=str), "wealth": pd.Series([], dtype=float)} ) with pytest.raises(ValueError, match="empty"): initial_conditions_from_dataframe( @@ -282,7 +305,7 @@ def test_unknown_column_raises(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life"], + "regime_name": ["working_life"], "health": ["bad"], "wealth": [10.0], "age": [25.0], @@ -301,7 +324,7 @@ def test_missing_state_column_raises(): model = get_basic_model() df = pd.DataFrame( { - "regime": ["working_life"], + "regime_name": ["working_life"], "age": [25.0], # missing "health" and "wealth" } @@ -319,7 +342,7 @@ def test_shock_state_columns_accepted(): model = get_shock_model(n_periods=4, distribution_type="uniform") df = pd.DataFrame( { - "regime": ["alive", "alive"], + "regime_name": ["alive", "alive"], "wealth": [2.0, 4.0], "health": ["bad", "good"], "income": [0.3, 0.7], @@ -333,7 +356,7 @@ def test_shock_state_columns_accepted(): ) assert jnp.allclose(conditions["income"], jnp.array([0.3, 0.7])) assert jnp.allclose(conditions["wealth"], jnp.array([2.0, 4.0])) - assert "regime" in conditions + assert "regime_id" in conditions def test_shock_state_columns_required(): @@ -341,7 +364,7 @@ def test_shock_state_columns_required(): model = get_shock_model(n_periods=4, distribution_type="uniform") df = pd.DataFrame( { - "regime": ["alive", "alive"], + "regime_name": ["alive", "alive"], "wealth": [2.0, 4.0], "health": ["bad", "good"], "age": [0.0, 0.0], @@ -372,7 +395,7 @@ def test_round_trip_with_discrete_model(): raw_conditions = { "wealth": jnp.array([DiscreteWealth.low, DiscreteWealth.high]), "age": jnp.array([50.0, 50.0]), - "regime": jnp.array([RegimeId.working_life, RegimeId.working_life]), + "regime_id": jnp.array([RegimeId.working_life, RegimeId.working_life]), } result_raw = model.simulate( params=params, @@ -383,7 +406,7 @@ def test_round_trip_with_discrete_model(): # DataFrame approach df = pd.DataFrame( { - "regime": ["working_life", "working_life"], + "regime_name": ["working_life", "working_life"], "wealth": ["low", "high"], "age": [50.0, 50.0], } @@ -472,7 +495,7 @@ def test_initial_conditions_heterogeneous_health_grids() -> None: model = _get_heterogeneous_health_model() df = pd.DataFrame( { - "regime": ["pre65", "pre65", "post65", "post65"], + "regime_name": ["pre65", "pre65", "post65", "post65"], "health": ["disabled", "good", "bad", "good"], "wealth": [10.0, 50.0, 30.0, 70.0], "age": [50.0, 50.0, 70.0, 70.0], @@ -488,7 +511,7 @@ def test_initial_conditions_heterogeneous_health_grids() -> None: assert jnp.array_equal(result["health"], jnp.array([0, 2, 0, 1])) assert jnp.allclose(result["wealth"], jnp.array([10.0, 50.0, 30.0, 70.0])) assert jnp.array_equal( - result["regime"], + result["regime_id"], jnp.array( [ _HetRegimeId.pre65, @@ -552,7 +575,7 @@ def _utility_without_status(wealth: float) -> float: df = pd.DataFrame( { - "regime": ["with_status", "with_status", "without_status"], + "regime_name": ["with_status", "with_status", "without_status"], "wealth": [10.0, 20.0, 30.0], "status": ["low", "high", pd.NA], "age": [50.0, 51.0, 50.0], @@ -616,7 +639,7 @@ def _retiree_utility(wealth: float) -> float: df = pd.DataFrame( { - "regime": ["earner", "earner", "retiree"], + "regime_name": ["earner", "earner", "retiree"], "wealth": [10.0, 20.0, 30.0], "income": [0.3, 0.7, float("nan")], "age": [50.0, 51.0, 50.0], @@ -704,7 +727,7 @@ def test_heterogeneous_health_solve_simulate() -> None: model = _get_heterogeneous_health_model() df = pd.DataFrame( { - "regime": ["pre65", "pre65", "post65", "post65"], + "regime_name": ["pre65", "pre65", "post65", "post65"], "health": ["disabled", "good", "bad", "good"], "wealth": [10.0, 50.0, 30.0, 70.0], "age": [50.0, 50.0, 70.0, 70.0], @@ -732,7 +755,9 @@ def test_heterogeneous_health_solve_simulate() -> None: assert list(period_0["health"]) == ["disabled", "good"] # Period 2: post65 subjects have correct health labels - period_2 = out.query("period == 2 and regime == 'post65'").sort_values("subject_id") + period_2 = out.query("period == 2 and regime_name == 'post65'").sort_values( + "subject_id" + ) assert list(period_2["health"]) == ["bad", "good"] @@ -741,7 +766,7 @@ def test_heterogeneous_health_simulate_use_labels_false() -> None: model = _get_heterogeneous_health_model() df = pd.DataFrame( { - "regime": ["pre65", "post65"], + "regime_name": ["pre65", "post65"], "health": ["disabled", "good"], "wealth": [10.0, 70.0], "age": [50.0, 70.0], @@ -1444,8 +1469,8 @@ def test_convert_series_function_level_series() -> None: regime_names_to_ids=model.regime_names_to_ids, ) arr = result["working_life"]["next_partner__probs_array"] - assert arr.shape == (3, 2, 2, 2) - assert float(arr[0, 0, 0, 0]) == pytest.approx(1.0) + assert arr.shape == (3, 2, 2, 2) # ty: ignore[unresolved-attribute] + assert float(arr[0, 0, 0, 0]) == pytest.approx(1.0) # ty: ignore[not-subscriptable] def test_convert_series_model_level_scalar_passthrough() -> None: @@ -1485,7 +1510,7 @@ def test_convert_series_regime_level_series() -> None: regime_names_to_ids=model.regime_names_to_ids, ) arr = result["working_life"]["next_partner__probs_array"] - assert arr.shape == (3, 2, 2, 2) + assert arr.shape == (3, 2, 2, 2) # ty: ignore[unresolved-attribute] def test_convert_series_mixed_dict() -> None: @@ -1512,20 +1537,20 @@ def test_convert_series_mixed_dict() -> None: ) assert result["working_life"]["H__discount_factor"] == 0.95 assert result["working_life"]["utility__disutility_of_work"] == 0.5 - assert result["working_life"]["next_partner__probs_array"].shape == (3, 2, 2, 2) + assert result["working_life"]["next_partner__probs_array"].shape == (3, 2, 2, 2) # ty: ignore[unresolved-attribute] assert result["working_life"]["next_wealth__interest_rate"] == 0.05 - np.testing.assert_allclose( + np.testing.assert_allclose( # ty: ignore[no-matching-overload] result["working_life"]["labor_income__wage"], jnp.array([10.0]) ) def test_convert_series_mapping_leaf() -> None: - """Series inside a MappingLeaf is converted.""" - from lcm.params import MappingLeaf # noqa: PLC0415 + """Series inside a `UserMappingLeaf` is converted in place.""" + from lcm.params import UserMappingLeaf # noqa: PLC0415 model = get_stochastic_model(3) series = _build_partner_probs_series(model) - leaf = MappingLeaf({"sub_key": series}) + leaf = UserMappingLeaf({"sub_key": series}) params = { "working_life": { "next_partner": {"probs_array": leaf}, @@ -1541,19 +1566,19 @@ def test_convert_series_mapping_leaf() -> None: regime_names_to_ids=model.regime_names_to_ids, ) converted_leaf = result["working_life"]["next_partner__probs_array"] - assert isinstance(converted_leaf, MappingLeaf) + assert isinstance(converted_leaf, UserMappingLeaf) arr = converted_leaf.data["sub_key"] - assert arr.shape == (3, 2, 2, 2) + assert arr.shape == (3, 2, 2, 2) # ty: ignore[unresolved-attribute] def test_convert_series_nested_mapping_leaf() -> None: - """Series inside nested MappingLeaf is recursively converted.""" - from lcm.params import MappingLeaf # noqa: PLC0415 + """Series inside nested `UserMappingLeaf` is recursively converted.""" + from lcm.params import UserMappingLeaf # noqa: PLC0415 model = get_stochastic_model(3) series = _build_partner_probs_series(model) - inner = MappingLeaf({"sub": series}) - outer = MappingLeaf({"inner_leaf": inner}) + inner = UserMappingLeaf({"sub": series}) + outer = UserMappingLeaf({"inner_leaf": inner}) params = { "working_life": { "next_partner": {"probs_array": outer}, @@ -1569,11 +1594,11 @@ def test_convert_series_nested_mapping_leaf() -> None: regime_names_to_ids=model.regime_names_to_ids, ) converted = result["working_life"]["next_partner__probs_array"] - assert isinstance(converted, MappingLeaf) + assert isinstance(converted, UserMappingLeaf) inner_converted = converted.data["inner_leaf"] - assert isinstance(inner_converted, MappingLeaf) + assert isinstance(inner_converted, UserMappingLeaf) assert not isinstance(inner_converted.data["sub"], pd.Series) - assert inner_converted.data["sub"].shape == (3, 2, 2, 2) + assert inner_converted.data["sub"].shape == (3, 2, 2, 2) # ty: ignore[unresolved-attribute] def test_convert_series_unknown_param_raises() -> None: @@ -1656,7 +1681,7 @@ def test_convert_series_with_derived_categoricals() -> None: regime_names_to_ids=model.regime_names_to_ids, ) arr = result["retirement"]["next_partner__probs_array"] - assert arr.shape == (3, 2, 2, 2) + assert arr.shape == (3, 2, 2, 2) # ty: ignore[unresolved-attribute] def test_convert_series_per_target_transition() -> None: @@ -1736,7 +1761,7 @@ def _next_wealth(wealth: float) -> float: regime_names_to_ids=model.regime_names_to_ids, ) arr = result["working"]["to_working_next_health__probs_array"] - assert arr.shape == (3, 2, 2) + assert arr.shape == (3, 2, 2) # ty: ignore[unresolved-attribute] def test_build_outcome_mapping_qualified_func_name() -> None: @@ -1834,8 +1859,8 @@ def _next_wealth_sc(wealth: float) -> float: ages=model.ages, regime_names_to_ids=model.regime_names_to_ids, ) - assert result_both["regime_a"]["utility__rates"].shape == (2,) - assert result_both["regime_b"]["utility__rates"].shape == (3,) + assert result_both["regime_a"]["utility__rates"].shape == (2,) # ty: ignore[unresolved-attribute] + assert result_both["regime_b"]["utility__rates"].shape == (3,) # ty: ignore[unresolved-attribute] def test_convert_series_runtime_grid_param() -> None: @@ -1876,16 +1901,16 @@ class _RId: ages=model.ages, regime_names_to_ids=model.regime_names_to_ids, ) - np.testing.assert_allclose(result["alive"]["wealth__points"], sr.to_numpy()) + np.testing.assert_allclose(result["alive"]["wealth__points"], sr.to_numpy()) # ty: ignore[no-matching-overload] def test_convert_series_sequence_leaf_traversal() -> None: - """Series inside a SequenceLeaf should be converted to JAX arrays.""" - from lcm.params.sequence_leaf import SequenceLeaf # noqa: PLC0415 + """Series inside a `UserSequenceLeaf` should be converted to JAX arrays.""" + from lcm.params.sequence_leaf import UserSequenceLeaf # noqa: PLC0415 model = get_stochastic_model(3) sr = pd.Series([10.0]) - leaf = SequenceLeaf((sr, 42)) + leaf = UserSequenceLeaf((sr, 42)) params = {"working_life": {"labor_income": {"wage": leaf}}} internal = broadcast_to_template( params=params, template=model._params_template, required=False @@ -1897,9 +1922,9 @@ def test_convert_series_sequence_leaf_traversal() -> None: regime_names_to_ids=model.regime_names_to_ids, ) converted = result["working_life"]["labor_income__wage"] - assert isinstance(converted, SequenceLeaf) + assert isinstance(converted, UserSequenceLeaf) assert not isinstance(converted.data[0], pd.Series) - np.testing.assert_allclose(converted.data[0], jnp.array([10.0])) + np.testing.assert_allclose(converted.data[0], jnp.array([10.0])) # ty: ignore[no-matching-overload] def test_resolve_categoricals_conflict_raises() -> None: @@ -2022,7 +2047,7 @@ def _health_probs_cross( arr = result["pre65"]["to_post65_next_health__health_trans_probs_cross"] # Shape: (n_ages=2, n_source_health=3, n_target_health=2) # n_ages=2 because AgeGrid has ages [0, 1]; missing age 1 is NaN-filled. - assert arr.shape == (2, 3, 2) + assert arr.shape == (2, 3, 2) # ty: ignore[unresolved-attribute] def test_resolve_categoricals_includes_derived_when_no_regime_name() -> None: diff --git a/tests/test_persistence.py b/tests/test_persistence.py index d99ac6d5a..917f29b49 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -5,6 +5,7 @@ import jax.numpy as jnp import pytest +import lcm from lcm import ( AgeGrid, LinSpacedGrid, @@ -15,10 +16,26 @@ categorical, load_snapshot, ) +from lcm import persistence as _persistence +from lcm import variables as _variables from lcm.persistence import _get_platform, load_solution, save_solution +from lcm.simulation.result import SimulationResult as _PublicSimulationResult from lcm.typing import ContinuousAction, ContinuousState, FloatND, ScalarInt +def test_forward_refs_bound_after_import() -> None: + """`Model` and `SimulationResult` are present in `lcm.persistence`'s globals. + + The package claw rewrites their string annotations on `save_simulate_snapshot` + into runtime forward references resolved against this module's globals at + call time. Missing the binding leaves those calls failing with + `BeartypeCallHintForwardRefException`. + """ + assert _persistence.Model is lcm.Model + assert _persistence.SimulationResult is _PublicSimulationResult + assert _variables.Regime is lcm.Regime + + @categorical(ordered=False) class _RegimeId: working: ScalarInt @@ -71,7 +88,7 @@ def _initial_conditions(): return { "wealth": jnp.array([2.0, 3.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([_RegimeId.working] * 2), + "regime_id": jnp.array([_RegimeId.working] * 2), } diff --git a/tests/test_random.py b/tests/test_random.py index 8e4396e22..437686113 100644 --- a/tests/test_random.py +++ b/tests/test_random.py @@ -1,14 +1,23 @@ +import jax import jax.numpy as jnp from lcm.simulation.random import generate_simulation_keys def test_generate_simulation_keys(): - key = jnp.arange(2, dtype="uint32") # PRNG dtype + """Each per-name key stream split from a seed key is mutually distinct.""" + key = jax.random.key(0) stochastic_next_functions = ["a", "b"] got = generate_simulation_keys( key=key, names=stochastic_next_functions, n_initial_states=1 ) - # assert that all generated keys are different from each other - matrix = jnp.array([key, got[0], got[1]["key_a"][0], got[1]["key_b"][0]]) + # Compare the raw key data: distinct keys give a rank-2 matrix of key rows. + matrix = jnp.array( + [ + jax.random.key_data(key), + jax.random.key_data(got[0]), + jax.random.key_data(got[1]["key_a"][0]), + jax.random.key_data(got[1]["key_b"][0]), + ] + ) assert jnp.linalg.matrix_rank(matrix) == 2 diff --git a/tests/test_regime.py b/tests/test_regime.py index 94b9e768b..4c322452a 100644 --- a/tests/test_regime.py +++ b/tests/test_regime.py @@ -167,7 +167,7 @@ def test_regime_requires_utility_in_functions(): def test_active_validation_rejects_non_callable(): """Active attribute must be a callable.""" - with pytest.raises(RegimeInitializationError, match="must be a callable"): + with pytest.raises(RegimeInitializationError, match="active"): Regime( transition=next_wealth, functions={"utility": utility}, @@ -179,10 +179,7 @@ def test_active_validation_rejects_non_callable(): def test_markov_transition_rejects_non_callable(): - with pytest.raises( - RegimeInitializationError, - match="MarkovTransition requires a callable", - ): + with pytest.raises(RegimeInitializationError, match="func"): MarkovTransition(func=42) # ty: ignore[invalid-argument-type] @@ -196,8 +193,8 @@ def test_identity_transition_call(): def test_identity_transition_discrete(): """Identity transition works for discrete states.""" identity = _IdentityTransition("education", annotation=DiscreteState) - result = identity(education=jnp.array(1)) - assert result == jnp.array(1) + result = identity(education=jnp.array(1, dtype=jnp.int32)) + assert result == jnp.array(1, dtype=jnp.int32) def test_identity_transition_name(): diff --git a/tests/test_regime_state_mismatch.py b/tests/test_regime_state_mismatch.py index 20e22fed2..d3d0fea8f 100644 --- a/tests/test_regime_state_mismatch.py +++ b/tests/test_regime_state_mismatch.py @@ -190,12 +190,12 @@ def next_regime(age: float) -> ScalarInt: initial_conditions={ "age": jnp.array([0.0, 0.0]), "wealth": jnp.array([20.0, 80.0]), - "regime": jnp.array([_RegimeId.alive] * 2), + "regime_id": jnp.array([_RegimeId.alive] * 2), }, period_to_regime_to_V_arr=period_to_regime_to_V_arr, ) df = result.to_dataframe(use_labels=False) - dead_rows = df[df["regime"] == "dead"] + dead_rows = df[df["regime_name"] == "dead"] valid_codes = {float(HeirPresent.no), float(HeirPresent.yes)} assert not dead_rows.empty, "Expected some rows in the dead regime" assert dead_rows["heir_present"].isin(valid_codes).all() @@ -282,12 +282,12 @@ def utility_dead(wealth: ContinuousState, heir_present: DiscreteState) -> FloatN initial_conditions={ "age": jnp.array([0.0, 0.0]), "wealth": jnp.array([20.0, 80.0]), - "regime": jnp.array([_RegimeId.alive] * 2), + "regime_id": jnp.array([_RegimeId.alive] * 2), }, period_to_regime_to_V_arr=period_to_regime_to_V_arr, ) df = result.to_dataframe(use_labels=False) - dead_rows = df[df["regime"] == "dead"] + dead_rows = df[df["regime_name"] == "dead"] valid_codes = {float(HeirPresent.no), float(HeirPresent.yes)} assert not dead_rows.empty, "Expected some rows in the dead regime" assert dead_rows["heir_present"].isin(valid_codes).all() @@ -369,13 +369,13 @@ def test_per_target_dict_transitions(): initial_conditions={ "age": jnp.zeros(n_subjects), "health": initial_health, - "regime": jnp.array([RegimeId.working_life] * n_subjects), + "regime_id": jnp.array([RegimeId.working_life] * n_subjects), }, period_to_regime_to_V_arr=period_to_regime_to_V_arr, ) df = result.to_dataframe(use_labels=False) - retired_rows = df[df["regime"] == "retirement"] + retired_rows = df[df["regime_name"] == "retirement"] valid_retired_codes = {float(HealthRetirement.bad), float(HealthRetirement.good)} assert not retired_rows.empty, "Expected some rows in the retired regime" assert retired_rows["health"].isin(valid_retired_codes).all(), ( diff --git a/tests/test_regression_test.py b/tests/test_regression_test.py index a6a47168e..887f0edf2 100644 --- a/tests/test_regression_test.py +++ b/tests/test_regression_test.py @@ -59,7 +59,7 @@ def test_regression_test(): initial_conditions={ "wealth": jnp.array([5.0, 20, 40, 70]), "age": jnp.array([18.0, 18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 4), + "regime_id": jnp.array([RegimeId.working_life] * 4), }, period_to_regime_to_V_arr=None, ).to_dataframe() @@ -101,7 +101,7 @@ def test_regression_precautionary_savings(): "age": jnp.full(n_subjects, 20.0), "wealth": jnp.full(n_subjects, 5.0), "income": jnp.full(n_subjects, 0.0), - "regime": jnp.zeros(n_subjects, dtype=jnp.int32), + "regime_id": jnp.zeros(n_subjects, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=12345, @@ -134,7 +134,7 @@ def test_regression_mortality(): initial_conditions={ "age": jnp.full(n_subjects, 40.0), "wealth": jnp.full(n_subjects, 100.0), - "regime": jnp.zeros(n_subjects, dtype=jnp.int32), + "regime_id": jnp.zeros(n_subjects, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=12345, @@ -176,7 +176,7 @@ def test_regression_mahler_yum(): params = {"alive": common_params} initial_conditions = { **initial_states, - "regime": jnp.full( + "regime_id": jnp.full( n_subjects, model.regime_names_to_ids["alive"], dtype=jnp.int32, @@ -283,7 +283,7 @@ def test_model_with_different_grid_types(grid_type: str): initial_conditions={ "wealth": jnp.array([5.0, 20, 40, 70]), "age": jnp.array([18.0, 18.0, 18.0, 18.0]), - "regime": jnp.array([RegimeId.working_life] * 4), + "regime_id": jnp.array([RegimeId.working_life] * 4), }, period_to_regime_to_V_arr=None, ) diff --git a/tests/test_runtime_params.py b/tests/test_runtime_params.py index 58fdfc27c..aba678941 100644 --- a/tests/test_runtime_params.py +++ b/tests/test_runtime_params.py @@ -300,7 +300,7 @@ def test_simulate_with_runtime_action_grid_no_nan() -> None: "alive": {"consumption": {"points": jnp.linspace(0.1, 5.0, 5)}}, } initial_conditions = { - "regime": jnp.array([RegimeId.alive, RegimeId.alive, RegimeId.alive]), + "regime_id": jnp.array([RegimeId.alive, RegimeId.alive, RegimeId.alive]), "age": jnp.array([0.0, 0.0, 0.0]), "wealth": jnp.array([2.0, 5.0, 9.0]), } diff --git a/tests/test_shock_grids.py b/tests/test_shock_grids.py index 256247f03..be478e049 100644 --- a/tests/test_shock_grids.py +++ b/tests/test_shock_grids.py @@ -35,11 +35,11 @@ def test_model_with_shock(distribution_type): got_simulate = model.simulate( params=params, initial_conditions={ - "health": jnp.asarray([0, 0]), - "income": jnp.asarray([0, 0]), - "wealth": jnp.asarray([1, 1]), + "health": jnp.asarray([0, 0], dtype=jnp.int32), + "income": jnp.asarray([0.0, 0.0]), + "wealth": jnp.asarray([1.0, 1.0]), "age": jnp.asarray([0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 2), + "regime_id": jnp.array([RegimeId.alive] * 2), }, period_to_regime_to_V_arr=got_solve, seed=42, @@ -84,16 +84,16 @@ def test_model_with_cross_regime_shocks(distribution_type: str) -> None: result = model.simulate( params=params, initial_conditions={ - "health": jnp.zeros(2, dtype=int), + "health": jnp.zeros(2, dtype=jnp.int32), "income": jnp.zeros(2), "wealth": jnp.ones(2), "age": jnp.zeros(2), - "regime": jnp.full(2, MultiRegimeId.work, dtype=int), + "regime_id": jnp.full(2, MultiRegimeId.work, dtype=jnp.int32), }, period_to_regime_to_V_arr=None, seed=42, ).to_dataframe() - assert set(result["regime"]) >= {"work", "retire"} + assert set(result["regime_name"]) >= {"work", "retire"} _GRID_CLASSES_WITH_GH_KWARG = [ diff --git a/tests/test_single_feasible_action.py b/tests/test_single_feasible_action.py index 08b61ef7a..f35a58d07 100644 --- a/tests/test_single_feasible_action.py +++ b/tests/test_single_feasible_action.py @@ -232,7 +232,7 @@ def test_simulate_with_constrained_action_grid(wealth_lo, consumption_lo, label) initial_conditions = { "age": jnp.array([0.0, 0.0, 0.0]), "wealth": jnp.array([wealth_lo, 5.0, 20.0]), - "regime": jnp.array( + "regime_id": jnp.array( [RegimeId.alive, RegimeId.alive, RegimeId.alive], dtype=jnp.int32 ), } @@ -500,7 +500,7 @@ def next_regime(age, last_alive_age): initial_conditions = { "age": jnp.array([0.0, 0.0, 0.0]), "wealth": jnp.array([2.0, 5.0, 9.0]), - "regime": jnp.array( + "regime_id": jnp.array( [RuntimeRegimeId.alive, RuntimeRegimeId.alive, RuntimeRegimeId.alive], dtype=jnp.int32, ), @@ -524,7 +524,7 @@ def test_runtime_action_grid_passes_initial_conditions_validation(): initial_conditions = { "age": jnp.array([0.0, 0.0, 0.0]), "wealth": jnp.array([10.0, 15.0, 20.0]), - "regime": jnp.array( + "regime_id": jnp.array( [RegimeId.alive, RegimeId.alive, RegimeId.alive], dtype=jnp.int32 ), } diff --git a/tests/test_solution_on_toy_model_deterministic.py b/tests/test_solution_on_toy_model_deterministic.py index 98996a52b..890c80ad3 100644 --- a/tests/test_solution_on_toy_model_deterministic.py +++ b/tests/test_solution_on_toy_model_deterministic.py @@ -156,7 +156,7 @@ def analytical_solve_deterministic(wealth_grid, params): def analytical_simulate_deterministic(initial_wealth, params): """Compute analytical simulation results in the same format as to_dataframe(). - Returns DataFrame with columns: period, subject_id, regime, value, wealth, + Returns DataFrame with columns: period, subject_id, regime_name, value, wealth, consumption, working. Sorted by (subject_id, period). Uses categorical dtypes for discrete variables to match to_dataframe() output. """ @@ -186,7 +186,7 @@ def analytical_simulate_deterministic(initial_wealth, params): [np.zeros(n_subjects), np.ones(n_subjects)] ).astype(int), "subject_id": np.tile(np.arange(n_subjects), 2), - "regime": pd.Categorical( + "regime_name": pd.Categorical( ["alive"] * (2 * n_subjects), categories=["alive", "dead"] ), "value": np.concatenate([V_arr_0, V_arr_1]), @@ -216,7 +216,7 @@ def dict_of_vectors_to_matrix(d): return np.column_stack(list(d.values())) -@pytest.mark.parametrize("discount_factor", [0, 0.5, 0.9, 1.0]) +@pytest.mark.parametrize("discount_factor", [0.0, 0.5, 0.9, 1.0]) @pytest.mark.parametrize("n_wealth_points", [100, 1_000]) def test_deterministic_solve(discount_factor, n_wealth_points): n_periods = 3 @@ -263,7 +263,7 @@ def test_deterministic_solve(discount_factor, n_wealth_points): aaae(got[1]["alive"], expected[1], decimal=DECIMAL_PRECISION) -@pytest.mark.parametrize("discount_factor", [0, 0.5, 0.9, 1.0]) +@pytest.mark.parametrize("discount_factor", [0.0, 0.5, 0.9, 1.0]) @pytest.mark.parametrize("n_wealth_points", [100, 1_000]) def test_deterministic_simulate(discount_factor, n_wealth_points): n_periods = 3 @@ -292,14 +292,14 @@ def test_deterministic_simulate(discount_factor, n_wealth_points): initial_conditions={ "wealth": jnp.array([0.25, 0.75, 1.25, 1.75]), "age": jnp.array([0.0, 0.0, 0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 4), + "regime_id": jnp.array([RegimeId.alive] * 4), }, period_to_regime_to_V_arr=None, ) # Filter to alive regime only (dead regime has trivial values) got = ( result.to_dataframe() - .query('regime == "alive"') + .query('regime_name == "alive"') .drop(columns=["age"]) # Analytical function doesn't include age .reset_index(drop=True) ) diff --git a/tests/test_solution_on_toy_model_stochastic.py b/tests/test_solution_on_toy_model_stochastic.py index fdb175b1e..d4a3ba58e 100644 --- a/tests/test_solution_on_toy_model_stochastic.py +++ b/tests/test_solution_on_toy_model_stochastic.py @@ -144,8 +144,8 @@ def analytical_solve_stochastic(wealth_grid, health_grid, params): def analytical_simulate_stochastic(initial_wealth, initial_health, health_1, params): """Compute analytical simulation results in the same format as to_dataframe(). - Returns DataFrame with columns: period, subject_id, regime, value, health, wealth, - consumption, working. Sorted by (subject_id, period). + Returns DataFrame with columns: period, subject_id, regime_name, value, + health, wealth, consumption, working. Sorted by (subject_id, period). Uses categorical dtypes for discrete variables to match to_dataframe() output. """ n_subjects = len(initial_wealth) @@ -179,7 +179,7 @@ def analytical_simulate_stochastic(initial_wealth, initial_health, health_1, par [np.zeros(n_subjects), np.ones(n_subjects)] ).astype(int), "subject_id": np.tile(np.arange(n_subjects), 2), - "regime": pd.Categorical( + "regime_name": pd.Categorical( ["alive"] * (2 * n_subjects), categories=["alive", "dead"] ), "value": np.concatenate([V_arr_0, V_arr_1]), @@ -208,7 +208,7 @@ def analytical_simulate_stochastic(initial_wealth, initial_health, health_1, par ] -@pytest.mark.parametrize("discount_factor", [0, 0.5, 0.9, 1.0]) +@pytest.mark.parametrize("discount_factor", [0.0, 0.5, 0.9, 1.0]) @pytest.mark.parametrize("n_wealth_points", [100, 1_000]) @pytest.mark.parametrize("probs_array", HEALTH_TRANSITION) def test_stochastic_solve(discount_factor, n_wealth_points, probs_array): @@ -267,7 +267,7 @@ def test_stochastic_solve(discount_factor, n_wealth_points, probs_array): aaae(got[1]["alive"], expected[1], decimal=DECIMAL_PRECISION) -@pytest.mark.parametrize("discount_factor", [0, 0.5, 0.9, 1.0]) +@pytest.mark.parametrize("discount_factor", [0.0, 0.5, 0.9, 1.0]) @pytest.mark.parametrize("n_wealth_points", [100, 1_000]) @pytest.mark.parametrize("probs_array", HEALTH_TRANSITION) def test_stochastic_simulate(discount_factor, n_wealth_points, probs_array): @@ -296,7 +296,7 @@ def test_stochastic_simulate(discount_factor, n_wealth_points, probs_array): "wealth": jnp.array([0.25, 0.75, 1.25, 1.75, 2.0]), "health": jnp.array([0, 1, 0, 1, 1]), "age": jnp.array([0.0, 0.0, 0.0, 0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 5), + "regime_id": jnp.array([RegimeId.alive] * 5), } result = model.simulate( params={"discount_factor": discount_factor, "alive": params_alive}, @@ -304,7 +304,7 @@ def test_stochastic_simulate(discount_factor, n_wealth_points, probs_array): period_to_regime_to_V_arr=None, ) # Filter to alive regime only (dead regime has trivial values) - got = result.to_dataframe().query('regime == "alive"').reset_index(drop=True) + got = result.to_dataframe().query('regime_name == "alive"').reset_index(drop=True) # Need to use health of second period from LCM output, to assure that the same # stochastic draws are used in the analytical simulation. diff --git a/tests/test_static_params.py b/tests/test_static_params.py index 4669145ca..7e980acf7 100644 --- a/tests/test_static_params.py +++ b/tests/test_static_params.py @@ -110,7 +110,7 @@ def test_simulate_with_fixed_params(): initial_conditions={ "wealth": jnp.array([5.0, 7.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 2), + "regime_id": jnp.array([RegimeId.alive] * 2), }, period_to_regime_to_V_arr=None, log_level="off", @@ -126,7 +126,7 @@ def test_simulate_with_fixed_params(): initial_conditions={ "wealth": jnp.array([5.0, 7.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 2), + "regime_id": jnp.array([RegimeId.alive] * 2), }, period_to_regime_to_V_arr=None, log_level="off", @@ -225,7 +225,7 @@ def test_all_params_fixed(): "wealth": jnp.array([50.0, 80.0]), "health": jnp.array([Health.bad, Health.good]), "age": jnp.array([60.0, 60.0]), - "regime": jnp.array([MarkovRegimeId.alive] * 2), + "regime_id": jnp.array([MarkovRegimeId.alive] * 2), } @@ -362,7 +362,7 @@ def test_series_fixed_param_with_derived_categoricals(): initial_conditions={ "wealth": jnp.array([3.0, 8.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 2), + "regime_id": jnp.array([RegimeId.alive] * 2), }, period_to_regime_to_V_arr=None, log_level="off", diff --git a/tests/test_stochastic.py b/tests/test_stochastic.py index 2ec8ec107..9bcd91f4b 100644 --- a/tests/test_stochastic.py +++ b/tests/test_stochastic.py @@ -41,15 +41,15 @@ def test_model_simulate_with_stochastic_model(): result = model.simulate( params=params, initial_conditions={ - "health": jnp.array([1, 1, 0, 0]), - "partner": jnp.array([0, 0, 1, 0]), + "health": jnp.array([1, 1, 0, 0], dtype=jnp.int32), + "partner": jnp.array([0, 0, 1, 0], dtype=jnp.int32), "wealth": jnp.array([10.0, 50.0, 30, 80.0]), "age": jnp.array([40.0, 40.0, 40.0, 40.0]), - "regime": jnp.array([RegimeId.working_life] * 4), + "regime_id": jnp.array([RegimeId.working_life] * 4), }, period_to_regime_to_V_arr=None, ) - df = result.to_dataframe().query('regime == "working_life"') + df = result.to_dataframe().query('regime_name == "working_life"') # Verify expected columns required_cols = {"period", "subject_id", "partner", "labor_supply"} @@ -190,11 +190,11 @@ def test_compare_deterministic_and_stochastic_results_value_function( # Compare simulation results # ================================================================================== initial_conditions = { - "health": jnp.array([1, 1, 0, 0]), - "partner": jnp.array([0, 0, 0, 0]), + "health": jnp.array([1, 1, 0, 0], dtype=jnp.int32), + "partner": jnp.array([0, 0, 0, 0], dtype=jnp.int32), "wealth": jnp.array([10.0, 50.0, 30, 80.0]), "age": jnp.array([40.0, 40.0, 40.0, 40.0]), - "regime": jnp.array([RegimeId.working_life] * 4), + "regime_id": jnp.array([RegimeId.working_life] * 4), } simulation_deterministic = model_deterministic.simulate( @@ -208,10 +208,10 @@ def test_compare_deterministic_and_stochastic_results_value_function( initial_conditions=initial_conditions, ) df_deterministic = simulation_deterministic.to_dataframe().query( - 'regime == "working_life"' + 'regime_name == "working_life"' ) df_stochastic = simulation_stochastic.to_dataframe().query( - 'regime == "working_life"' + 'regime_name == "working_life"' ) pd.testing.assert_frame_equal( df_deterministic.reset_index(drop=True), diff --git a/tests/test_validate_param_types.py b/tests/test_validate_param_types.py index 06a95d597..51a5a6c29 100644 --- a/tests/test_validate_param_types.py +++ b/tests/test_validate_param_types.py @@ -60,7 +60,7 @@ def test_numpy_array_param_normalised_to_canonical_jax_array() -> None: """A numpy array param is cast to a JAX array at `canonical_float_dtype()`.""" model = _make_model() internal = model._process_params( - params={"bonus": np.asarray(1.0, dtype=np.float64), "discount_factor": 0.95} # ty: ignore[invalid-argument-type] + params={"bonus": np.asarray(1.0, dtype=np.float64), "discount_factor": 0.95} ) bonus = internal["working"]["utility__bonus"] assert isinstance(bonus, Array) @@ -74,7 +74,7 @@ def test_jax_array_param_kept_at_canonical_dtype() -> None: params={"bonus": jnp.asarray(1.0), "discount_factor": 0.95} ) bonus = internal["working"]["utility__bonus"] - assert bonus.dtype == canonical_float_dtype() + assert bonus.dtype == canonical_float_dtype() # ty: ignore[unresolved-attribute] def test_python_float_param_cast_to_canonical_dtype() -> None: @@ -82,5 +82,5 @@ def test_python_float_param_cast_to_canonical_dtype() -> None: model = _make_model() internal = model._process_params(params={"bonus": 1.0, "discount_factor": 0.95}) bonus = internal["working"]["utility__bonus"] - assert float(bonus) == 1.0 - assert bonus.dtype == canonical_float_dtype() + assert float(bonus) == 1.0 # ty: ignore[invalid-argument-type] + assert bonus.dtype == canonical_float_dtype() # ty: ignore[unresolved-attribute] diff --git a/tests/test_validate_regime_transition_probs.py b/tests/test_validate_regime_transition_probs.py index 9d97f1e87..9f121344b 100644 --- a/tests/test_validate_regime_transition_probs.py +++ b/tests/test_validate_regime_transition_probs.py @@ -240,6 +240,56 @@ def test_solve_catches_transition_bug_hidden_at_first_grid_point(): model.solve(params=params) +def test_regime_transition_validation_passes_period_as_int32(): + """Regime-transition validation hands the transition function a 0-d int32 `period`. + + The x64-enabled test suite would otherwise trace a Python-int `period` as + int64 inside `jax.vmap`, breaking any consumer that dtype-checks its + `period` slot (e.g. a beartyped `Period` hint). + """ + seen_period_dtypes: list = [] + + def _transition_recording_period( + action: DiscreteAction, period: ScalarInt + ) -> FloatND: + seen_period_dtypes.append(getattr(period, "dtype", None)) + # `action` keeps a grid variable in the signature so validation takes + # the `jax.vmap` path; both outcomes route to the always-active + # terminal regime so the probabilities are valid at every transition. + return jnp.where( + action == _Action.leave, + jnp.array([0.0, 1.0]), + jnp.array([0.0, 1.0]), + ) + + active = Regime( + transition=MarkovTransition(_transition_recording_period), + active=lambda age: age < 27, + actions={ + "action": DiscreteGrid(_Action), + "consumption": LinSpacedGrid(start=1, stop=10, n_points=5), + }, + states={"wealth": LinSpacedGrid(start=1, stop=10, n_points=5)}, + state_transitions={"wealth": lambda wealth, consumption: wealth - consumption}, + constraints={"budget": lambda consumption, wealth: consumption <= wealth}, + functions={"utility": lambda consumption: jnp.log(consumption)}, # noqa: PLW0108 + ) + terminal = Regime( + transition=None, + states={"wealth": LinSpacedGrid(start=1, stop=10, n_points=5)}, + functions={"utility": lambda wealth: jnp.log(wealth)}, # noqa: PLW0108 + ) + model = Model( + regimes={"active": active, "terminal": terminal}, + ages=AgeGrid(start=25, stop=27, step="Y"), + regime_id_class=_RegimeId, + ) + model.solve(params={"discount_factor": 0.95}) + + assert seen_period_dtypes + assert all(dtype == jnp.int32 for dtype in seen_period_dtypes) + + N_PERIODS = 4 @@ -268,7 +318,7 @@ def test_simulate_raises_for_invalid_regime_transition_probs(): initial_conditions = { "age": jnp.array([40.0]), "wealth": jnp.array([10.0]), - "regime": jnp.array([MortalityRegimeId.working_life]), + "regime_id": jnp.array([MortalityRegimeId.working_life]), } with pytest.raises(InvalidRegimeTransitionProbabilitiesError): model.simulate( @@ -285,7 +335,7 @@ def test_simulate_with_solve_raises_for_invalid_regime_transition_probs(): initial_conditions = { "age": jnp.array([40.0]), "wealth": jnp.array([10.0]), - "regime": jnp.array([MortalityRegimeId.working_life]), + "regime_id": jnp.array([MortalityRegimeId.working_life]), } with pytest.raises(InvalidRegimeTransitionProbabilitiesError): model.simulate( diff --git a/tests/test_validation_scalar_actions.py b/tests/test_validation_scalar_actions.py index e53e521b3..1f982f694 100644 --- a/tests/test_validation_scalar_actions.py +++ b/tests/test_validation_scalar_actions.py @@ -38,7 +38,7 @@ def _aggregate_with_ids( """ data = jnp.array([consumption]) # shape-(1,) when scalar ids = invariant_array.data["ids"] # shape-(1,) always - result = jax.ops.segment_sum(data, ids, num_segments=1) + result = jax.ops.segment_sum(data, ids, num_segments=1) # ty: ignore[invalid-argument-type] return result.squeeze() @@ -108,7 +108,7 @@ def test_validation_vmaps_over_action_combos(): initial_conditions={ "wealth": jnp.array([5.0, 7.0]), "age": jnp.array([0.0, 0.0]), - "regime": jnp.array([RegimeId.alive] * 2), + "regime_id": jnp.array([RegimeId.alive] * 2), }, period_to_regime_to_V_arr=None, log_level="off", diff --git a/tests/test_variables.py b/tests/test_variables.py index 02998948f..2de2a0974 100644 --- a/tests/test_variables.py +++ b/tests/test_variables.py @@ -162,7 +162,7 @@ def next_state(x): }, functions={"utility": lambda c_action: 0}, # noqa: ARG005 ) - variables = Variables.from_regime(regime) # ty: ignore[invalid-argument-type] + variables = Variables.from_regime(regime) assert list(variables) == ["a_discrete", "b_continuous", "c_action"] @@ -188,5 +188,5 @@ def next_state(x): actions={"a": DiscreteGrid(binary_category_class)}, functions={"utility": lambda a: 0}, # noqa: ARG005 ) - variables = Variables.from_regime(regime) # ty: ignore[invalid-argument-type] + variables = Variables.from_regime(regime) assert variables.discrete_state_names == ("first", "second", "third")