--- orphan: false --- # What's new in v0.3.1 ```{versionadded} v0.3.1 ``` v0.3.1 (2026-06-22) is a small point release. It adds one function, early, for a downstream project that needed a differentiable linear solve from a `pip install` before 0.4.0. Nothing else changed: no existing surface moved. ## What is new - **`maddening.core.solver_utils.ift_linear_solve`** (`EXPERIMENTAL`): a differentiable linear solve. It wraps `lineax.linear_solve`, so a node that solves a linear system in `update()` gets gradients through the solve without a `custom_vjp` of its own. The solvers are `"gmres"` (the default, with its restart set to `min(N, 50)`), `"cg"` (for a symmetric positive-definite matrix) and `"dense"`. A `preconditioner` is passed on to lineax. ## Dependencies - A new `[ift]` extra installs `lineax>=0.0.7`. `lineax` is imported only when `ift_linear_solve` is called, so the base install did not change. ## Its status in 0.4.0 - `ift_linear_solve` is still `EXPERIMENTAL`. 0.3.1 said it would become `STABLE` with `AdaptiveNode`; 0.4.0 promoted nothing to `STABLE`. - `lineax` is a base dependency in 0.4.0, and the `[ift]` extra installs nothing. - Its default `atol` is relative to the right-hand side (`MADD-ANO-123`). It was an absolute `1e-8`. - 0.4.0 fixes two of its defects. With `solver="cg"` or `"gmres"`, 0.3.1 could return a value that was not the solution, with no error (`MADD-ANO-283`), and for a right-hand side with a NaN or infinite entry it returned zeros with no error (`MADD-ANO-155`). - With `solver="cg"` it can still return NaN where lineax's CG breaks down (`MADD-ANO-264`, partly resolved). Use `solver="gmres"`. The [0.4.0 release notes](v0.4.0.md) have the rest. The changelog's `[0.3.1]` entry is the itemised list.