Skip to content

Commit 2d81019

Browse files
committed
fix(deps): require dyno 0.1.15 and install it from conda-forge
The floor of 0.1.13 was wrong in two ways, both of which left CI red: - `tests/test_model_v2.py` and `tests/test_tau_garray.py` import `dyno.dynspec.recipe.extract_complementarity`, which only exists from 0.1.15 on. On 0.1.13/0.1.14 collection aborts and every job fails. - the 0.1.13/0.1.14 wheels carry both `dyno/examples/RBC.dyno` and `dyno/examples/rbc.dyno`; the case-insensitive collision makes uv refuse to extract them, so `pixi install` failed on macOS and Windows (Linux tolerated it, which is why only those platforms broke). Raise the floor to `dynopy>=0.1.15,<0.2` and take the package from conda-forge as `dyno`, which is now released there. conda-forge moves ahead of the econforge channel: with pixi's default strict channel priority the first channel carrying a package wins, and econforge still only had 0.1.14, so it was shadowing the new release. min-deps pins the same version, and ci/check_deps.py maps the PyPI name `dynopy` to the conda name `dyno` (`CONDA_NAMES`) so the two manifests stay in sync. The `../dyno.py` editable checkout and its PYTHONPATH guard were already removed; nothing here depends on a sibling checkout any more. Verified locally with the lock: `pixi install -e dev --locked` succeeds, `extract_complementarity` imports, `pytest` gives 78 passed, and `zensical build --clean --strict` is clean. Note: the editable `dolo` declares `dynopy` as a PyPI dependency, so the lock also installs the PyPI `dynopy` alongside the conda `dyno`. Both resolve to the same 0.1.15 release, so the installed files are identical.
1 parent acf7955 commit 2d81019

5 files changed

Lines changed: 974 additions & 825 deletions

File tree

‎DEV_NOTES.md‎

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ Date of last update: 2026-10-18. Read this instead of re-reading the whole conve
1010

1111
Rewrite dolo's model *import* so that:
1212

13-
- D1 — dolo depends on **dyno.py** (`dynopy` on PyPI, `dyno` project
14-
name) and uses `dyno.dynspec` for equation parsing, conformity
15-
checking and recipes. dyno.py is now released, so pixi installs the
16-
published PyPI distribution: the earlier local `../dyno.py` editable
17-
checkout and its PYTHONPATH guard are gone (see §4); `min-deps` pins
18-
the published `dynopy==0.1.13`. **dyno.py code is not modified
13+
- D1 — dolo depends on **dyno.py** (PyPI name `dynopy`, conda-forge name
14+
`dyno`) and uses `dyno.dynspec` for equation parsing, conformity
15+
checking and recipes. The `../dyno.py` editable checkout and its
16+
PYTHONPATH guard are gone: the released package is used, with the floor
17+
raised to **0.1.15** — the first release that ships
18+
`dynspec.recipe.extract_complementarity` and that drops the wheel
19+
entries that collided case-insensitively (`dyno/examples/RBC.dyno` vs
20+
`rbc.dyno`), which broke pip/pixi installs on macOS and Windows.
21+
`min-deps` pins the same version. **dyno.py code is not modified
1922
by dolo work.**
2023
- D2 — equation evaluation/differentiation uses **JAX**. Two stages
2124
happened: (a) `EquationsEvaluator` walking lark trees at trace time
@@ -139,26 +142,31 @@ produce identical results to legacy.
139142

140143
## 4. Dependencies (pixi/pyproject)
141144

142-
- `pyproject.toml` added: `dynopy>=0.1.13,<0.2`, `jax>=0.4.38,<0.5`,
143-
`numba>=0.60.0,<0.70`.
145+
- `pyproject.toml` declares: `dynopy>=0.1.15,<0.2`, `jax>=0.4.38,<0.5`,
146+
`numba>=0.60.0,<0.70`, and the rest of the runtime set.
144147
- `pixi.toml`:
145-
- `[pypi-dependencies]`: `dolo` (editable) + `dynopy >=0.1.13,<0.2` +
146-
`jax >=0.4.38,<0.5`. `dynopy` is declared explicitly so the
147-
environment has a single provider of the `dyno/` package: the
148-
editable `dolo` pulls it from PyPI regardless, and adding the conda
149-
`dyno` package (conda-forge/econforge) on top would install a second
150-
copy of the same top-level package.
151-
- `[feature.min-deps.pypi-dependencies]`: `dynopy ==0.1.13`, `jax ==0.4.38`.
152-
- The former `../dyno.py` editable path dependency and its
153-
`[activation.env]` PYTHONPATH guard are gone: they existed only to
154-
prefer the local checkout over the published dynopy.
155-
- conda `[dependencies]`: `rich = "<15"` (the Jupyter/MkDocs stack pins
156-
conda rich 15 while dynopy needs rich<15).
148+
- channels: `["conda-forge", "https://prefix.dev/econforge"]` —
149+
conda-forge first, because pixi's default strict channel priority
150+
takes a package from the first channel that carries it, and the
151+
econforge channel lags conda-forge for `dyno`.
152+
- conda `[dependencies]`: `dyno >=0.1.15,<0.2` (the conda-forge name of
153+
the `dynopy` project) and `rich = "<15"` (the Jupyter/MkDocs stack
154+
pins conda rich 15 while dynopy requires rich<15).
155+
- `[pypi-dependencies]`: `dolo` (editable) + `jax >=0.4.38,<0.5`.
156+
- `[feature.min-deps]`: conda `dyno ==0.1.15`, pypi `jax ==0.4.38`.
157+
- No `[activation.env]` PYTHONPATH guard any more; it existed only to
158+
make the local `../dyno.py` checkout win over the published dynopy.
159+
- Known wart: the editable `dolo` declares `dynopy` as a PyPI
160+
dependency, so the lock installs the PyPI `dynopy` *in addition to*
161+
the conda `dyno`. Both are the same release (`dyno` 0.1.15 /
162+
`dynopy` 0.1.15), so the files are identical and either copy works;
163+
only one of the two is actually needed.
157164
- Why jax is on PyPI and capped `<0.5`: conda-forge has no jaxlib for
158165
win-64; jaxlib dropped macosx_x86_64 wheels in 0.5.0 and the workspace
159166
still locks osx-64. jaxlib 0.4.38 has wheels for every platform×py312/313.
160-
- `ci/check_deps.py` now understands `[pypi-dependencies]` (incl.
161-
min-deps pypi) and table-valued path entries; verified green.
167+
- `ci/check_deps.py` understands `[pypi-dependencies]` (incl. min-deps
168+
pypi) and table-valued path entries, and maps the PyPI name `dynopy`
169+
to the conda name `dyno` via `CONDA_NAMES`; verified green.
162170

163171
## 5. Performance: everything learned
164172

‎ci/check_deps.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
ROOT = Path(__file__).resolve().parent.parent
2828

2929
# PyPI name -> conda-forge name, where they differ.
30-
CONDA_NAMES: dict[str, str] = {}
30+
# `dynopy` is the PyPI publishing name of the `dyno` project: pyproject.toml
31+
# declares the PyPI name while pixi installs the conda-forge package `dyno`.
32+
CONDA_NAMES: dict[str, str] = {"dynopy": "dyno"}
3133

3234
# Packages where the pyproject.toml floor cannot be installed in the
3335
# min-deps environment (e.g. pyyaml 6.0 has no conda-forge build for

0 commit comments

Comments
 (0)