ProbNumDiffEq.jl: Probabilistic Numerical Solvers for Ordinary Differential Equations in Julia
Abstract
ProbNumDiffEq v0.18.0 Diff since v0.17.1 Breaking changes ClassicSolverInit no longer has a default alg, and ProbNumDiffEq no longer depends on OrdinaryDiffEqVerner and OrdinaryDiffEqRosenbrock (#426). Pass an algorithm explicitly, e.g. ClassicSolverInit(AutoTsit5(Rosenbrock23())). DynamicMVDiffusion and a calibrated FixedMVDiffusion now require a block-diagonal covariance, i.e. the EK0 with an IWP prior or the DiagonalEK1 (#454). Other setups, such as the EK0 with an IOUP or Matern prior, now throw an ArgumentError when the algorithm is constructed. Use a scalar diffusion or an uncalibrated FixedMVDiffusion(diffusion, false) instead. The observation noise covariance of the data likelihoods (DataUpdateCallback, dalton_data_loglik, filtering_data_loglik, fenrir_data_loglik) must be positive definite; e.g. observation_noise_cov = 0 now throws an ArgumentError (#456). ManifoldUpdate throws if the residual is longer than the ODE dimension or if its measurement covariance is singular (#432). The residual needs one component per independent constraint and must not be zero-padded to length(u). solve with saveat now throws an ArgumentError; it used to return an inconsistent solution (#429). Scalar diffusion models (FixedDiffusion, DynamicDiffusion) store sol.diffusions as numbers instead of Diagonal matrices (#442). LTISDE is no longer iterable: use drift(sde) and dispersion(sde) instead of F, L = to_sde(prior) (#449). Bug fixes sample applied the smoothing correction twice, so sampled trajectories understated the posterior uncertainty (#438). With save_everystep=false, the final covariance was not calibrated and dense evaluation threw a BoundsError (#429). Data log-likelihoods (#456): Fenrir ignored the last data point when it lay before the end of the time span; a data point at t0 gave wrong values in all three methods; and with the EK0 (Kronecker covariance), all data log-likelihoods and sol.pnstats.log_likelihood were off by a logdet term for d > 1. FixedMVDiffusion calibrated every dimension with the first diagonal entry of the measurement covariance. This changes the calibrated covariances of DiagonalEK1(diffusionmodel=FixedMVDiffusion()) and of the EK0 with a diagonal mass matrix (#454). DiagonalEK1 lost its AD settings (e.g. standardtag, concrete_jac) when solved, because remake reset them to the defaults (#460). PNStats printed the log-likelihood truncated to an integer (#445). New features Partial observations in the data likelihoods for the DiagonalEK1 (#441). Performance Dense output and sampling keep the Kronecker and block-diagonal covariance structure (#452), and their cost no longer grows with the number of saved points (#445). ManifoldUpdate is about 3x faster and allocates far less (#432). Fixed-step solves reuse the transition matrices whenever the step size repeats (#446). Dropped the ToeplitzMatrices dependency, which removes 8 packages from the dependency tree and speeds up loading (#451). Other Clear errors for solves backward in time, and for non-diagonal mass matrices with block-diagonal covariances (#450). Merged pull requests: Remove default alg from ClassicSolverInit; drop Verner/Rosenbrock deps (#426) (@nathanaelbosch) Try DocumenterCodeBlocks.jl for nicer code highlighting (#427) (@nathanaelbosch) Fix the solution bookkeeping for save_everystep=false (#428) (#429) (@nathanaelbosch) Access postamble! via SciMLBase instead of OrdinaryDiffEqCore (#431) (@ChrisRackauckas-Claude) Speed up the ManifoldUpdate callback and remove its allocations (#432) (@nathanaelbosch) Fix CodeQuality tests (#433) (@nathanaelbosch) Use explicit display text for @cite references in docstrings (#434) (@nathanaelbosch) Add energy conservation benchmarks (#436) (@nathanaelbosch) Fix x_filt/x_smooth aliasing bug (#438) (@nathanaelbosch) Support partial observations in data likelihoods for DiagonalEK1 (#441) (@nathanaelbosch) Store scalar diffusions as Numbers instead of Fill-backed Diagonals (#442) (@nathanaelbosch) Remove dead code in initialization, diffusions and fast_linalg (#443) (@nathanaelbosch) Remove unused fields from EKCache (#444) (@nathanaelbosch) Fix dense-evaluation cost and PNStats printing; simplify solution types (#445) (@nathanaelbosch) Clean up perform_step! and the diagonal diffusion checks (#446) (@nathanaelbosch) Allocation-free getupperright!, drop reshape_no_alloc, rename IsometricKroneckerProduct (#447) (@nathanaelbosch) Small cleanups in initialization (#448) (@nathanaelbosch) Small cleanups in priors (#449) (@nathanaelbosch) Small fixes: clearer errors, _unwrap_f, and hygiene (#450) (@nathanaelbosch) Drop the ToeplitzMatrices dependency (#451) (@nathanaelbosch) Keep Kronecker and block-diagonal structure in dense output and sampling (#452) (@nathanaelbosch) Comments only, no code changes. (#453) (@nathanaelbosch) Restrict multivariate diffusion estimates to block-diagonal covariances, and fix FixedMVDiffusion calibration (#454) (@nathanaelbosch) Add AGENTS.md with guidance for coding agents (#455) (@nathanaelbosch) Fix data log-likelihoods at t0, before the end of the time span, and with Kronecker covariances (#456) (@nathanaelbosch) Lift dense filtering steps to structured covariances through two helpers (#459) (@nathanaelbosch) Keep DiagonalEK1's AD settings through remake (#460) (@nathanaelbosch) Closed issues: Improve speed and reduce allocations in the ManifoldUpdate callback (#126) Solving Forward and Inverse Problems (#196) workflow: linear_gaussian_filtering_smoothing (#197) Try using TaylorDiff.jl instead of TaylorIntegration.jl (#253) Add unit tests for the functions implemented in scr/fast_linalg.jl (#254) Add one or more energy conservation benchmarks (#277) Use FastLapackInterface.jl? (#300) Make partial observations in the data likelihoods work with the DiagonalEK1 (#303) Fix the usage of idxs in plot recipes (#315) Citations in docstrings are not visualized properly in the REPL (#329) save_everystep=false returns an uncalibrated final covariance with static diffusions (#428) Fenrir: support second-order ODEs with block-diagonal covariances (#458)