Dear all,
It’s been a while since our last announcement about IntervalArithmetic.jl. We’d like to share what’s been happening over the past two years, and where the package is headed next.
From v0.20 to v0.22
Version 0.20, released back in 2021, was our longest-lived stable release. But it was also riddled with long-standing bugs and several problematic design choices. In particular, the early philosophy of the package leaned heavily into syntactic sugar, sometimes at the cost of conflating numbers with intervals.
For example, ==
, <
, and other boolean functions were defined on intervals. But when intervals overlap, ==
becomes ambiguous: should it mean that all values in the two intervals are equal, or that some “true” value (hidden in each, e.g. \pi inside interval(pi)
) is equal (which is undecidable)? At the time, we opted for the former behaviour, but this led to subtle and silent errors, especially in generic code (typically designed for floating-point arithmetic) involving promotion and conversion (e.g., norm(..., Inf)
).
These ambiguities, and their implications for code correctness and generic programming, led us to gradually remove most automatic interactions between numbers and intervals. This process began with a short-lived v0.21 and was more fully realized in v0.22, released in 2023.
v0.23: Feature Freeze Before 1.0
Last Friday, we tagged v0.23. This release is intended as the final step before a long-awaited 1.0. There are no planned breaking changes between 0.23 and 1.0 (barring unforeseen issues, and oversights…). Therefore, we strongly encourage anyone using IntervalArithmetic.jl for rigorous computations to test their packages and code against 0.23.
We know the release comes with some breaking changes and requires a bit of adjustements. But we believe the current design offers a much stronger base for reliable computations.
I’d like to add that a big part of what’s been driving this effort is the goal of strengthening validated numerics in Julia, especially in the context of nonlinear differential equations.
Feedback is more than welcome, whether it’s bug reports, suggestions, or simply impressions.
Please, also feel free to reach out if you need any help in upgrading to 0.23.
Overview of the main changes
Here are some of the disruptive changes that came with this cleanup:
-
DecoratedInterval
has been removed. The core type is now simplyInterval
, which automatically includes decorations. For advanced use cases, there is a low-levelBareInterval
structure, but most users should use theinterval
constructor and stick withInterval
. -
IntervalBox
has been removed. You should now simply useAbstractVector
instead. If you want to keep usingIntervalBox
, @dpsanders has spun out IntervalBoxes.jl as a separate package, which will get a 1.0 release after IntervalArithmetic takes the leap.
Moreover,
-
Thanks to @joeldahne, we now support interoperability with Arblib.jl.
-
We also ship an OpenBLAS artefact OpenBLASConsistentFPCSR to control rounding direction, which allows us to perform fast matrix multiplication using one of Rump’s algorithms.
-
A new “NG” flag has been introduced to track “non-guaranteed” operations. It’s triggered, for example, when mixing non-interval types in interval operations.
For more details on the design philosophy behind the most disruptive changes, see this section of the documentation.
Best regards,
@OlivierHnt, and @Kolaru