Skip to content

Commit

Permalink
Beta 0.22 (#593)
Browse files Browse the repository at this point in the history
* Beta 0.22

* Remove `Random`

* Update CI

* Fix jldoctest in display.jl

* More fixes of jldoctest

* One more fix

* Fix propagation of `isguaranteed`

* Improve tests

* Fix `isguaranteed` for midpoint constructor

* Small cleanup

* Add more ForwardDiff related tests

* Revised files

* Update LICENSE.md

* Re-work unexported constructor `atomic`

* Improve docstring for powers

* Fix typo

* Revive `@interval`; conversion of `AbstratcIrrational` is guaranteed

* Cleanup power.jl

* Rework rounding

* Fix typo

* Remove `FastRounding`, make `:accurate` the `:fast` rounding option

* Fix decoration for `^` and `fastpow`

* Fix docstring

* Cleanup

* Update NEWS.md

* Add convient alias

* Do not use trivial decoration for `mince` and `bisect`

* Fix `interiordiff`

* Add `Fix2` mechanism for `isequal_interval` and `in_interval`

* Fix `atomic` for `BigFloat`

* Fix tests

* Fix docstring

* Rename `^` to `pow`; redefine a new `^` method

* Fix docstrings

* Remove `scaled_mid`

* Fix docstrings

* Remove `SetRounding`

* Small fixes

* Implement a configuration mechanism for `^`

* Remove support for `IntervalRounding{:fast}`

* Use `fastpow` as the default for `^`

* Add `fastpown`

* Fix `hypot`

* Fix decoration and construction edge case

* Cleanup

* Update compat and remove old files

* Fix typo

* Export `fastpown`

* Fix `fastpown`

* Do not use `@interval`

* Fix `@interval` with `Rational{Int}` bound type

* Improve `parse` performance

* Add license of ITF1788 test suite

* Add `one`/`zero` method and propagates `isguaranteed`
  • Loading branch information
OlivierHnt committed Dec 13, 2023
1 parent 742a26f commit a699125
Show file tree
Hide file tree
Showing 119 changed files with 28,444 additions and 26,946 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
fail-fast: false
matrix:
version:
- '1.8'
- '1.9'
- '1'
- 'nightly'
os:
Expand Down
8 changes: 4 additions & 4 deletions LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Copyright (c) David P. Sanders, Luis Benet, and other contributors:
MIT License

https://github.com/JuliaIntervals/IntervalArithmetic.jl/contributors
Copyright (c) 2014 David P. Sanders and Luis Benet
Copyright (c) 2023 Luis Benet, Luca Ferranti, Olivier Hénot and Benoît Richard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

Expand All @@ -14,8 +15,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI

The code is implemented in Julia, also licensed under the MIT license:

Copyright (c) Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors:

Copyright (c) 2009 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors:
https://github.com/JuliaLang/julia/contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Expand Down
317 changes: 24 additions & 293 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,305 +1,36 @@
# What's new in `IntervalArithmetic.jl`
# News

## v0.17
## master

### Supported versions of Julia
- The package now supports only Julia v1.3 and later.
## 0.22

### Breaking changes
- Changed from using `FastRounding.jl` to `RoundingEmulator.jl` for the default rounding mode. [#370](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/370)
Major changes since 0.20 and 0.21:

- interval structures:
- new bare (i.e. no decorations) interval structure `BareInterval`, which is not a subtype of `Real`
- `Interval` is now decorated (`DecoratedInterval` is removed) and has a new boolean field `isguaranteed`; the `Interval` type is a subtype of `Real`

## v0.15
- constructors:
- `@floatinterval` and `@biginterval` are removed; `@interval` accepts a bound type as its first parameter
- the recommended interval type is `Interval` and its constructors are `interval`, `@interval`, `parse(T<:Interval, string)`, `I"string"`. A `bareinterval` constructor is also available for `BareInterval`, as well as `parse(T<:BareInterval, string)`
- warning is prompted when trying to construct invalid intervals

### Supported versions of Julia
- Julia 0.6 is no longer supported. The package is now fully compatible with Julia 0.7 and 1.0. [#201](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/201)
- conversion/promotion:
- numbers cannot be converted to `BareInterval` to prevent silent errors
- numbers can be converted to `Interval` but the `isguaranteed` field is set to false to indicate that an error may have happened

### Breaking changes
- `showall` has been removed from Julia. We now export the function `showfull` instead. [#203](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/203
- unicode alias (e.g. `..`, `±`, ``, ``, etc.) are now contained in an unexported submodule `Symbols` to prevent conflicts (e.g. `..` is exported by [Makie.jl](https://github.com/MakieOrg/Makie.jl))

- In keeping with the change to base Julia, `atan2` has been replaced by the 2-argument method of `atan`. [#192](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/192)
- display:
- fixed previous matrix alignment issues
- `setformat` has been renaed `setdisplay`; the display format `:standard` has been renamed `:infsup`

### First contributions
Caroline Wormell and Mohamed Tarek made first contributions to the package.
- set-based flavor is supported; some ground work on a flavor mechanism has been laid out to support others, e.g. cset flavor

- partial support for `Complex{<:Interval}`; some elementary functions are still missing

## v0.14
- ambiguous boolean `Base` functions (e.g. `==`, `issubset`, `<`, etc.) are no longer overloaded and throw an error; new counterparts methods have been defined (e.g. `isequal_interval`, `issubset_interval`, etc.)

### Breaking changes
- `IntervalBox` is no longer a subtype of `StaticVector` or of `AbstractArray`,
but rather contains an `SVector` of `Interval`s. The internal `SVector` of an `IntervalBox` `X` is available as `X.v`. [#152](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/152)

### New functions
- Various functions, including `bisect`, were moved here from `IntervalRootFinding.jl`. [#160](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/160)

- The set operations ``, `` and `` were added [#154](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/154)

### Supported versions of Julia
- This is slated to be the last minor release supporting Julia 0.6.

### First contributions
- @mforets and @Kolaru made first contributions to the package.

## v0.13

### Breaking changes
- `convert(Interval{T}, x::T)` no longer does any rounding: it creates
the thin (zero-width) interval `[x, x]`. [#114](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/114)

Note that this implies that numbers are no longer rounded in operations combining them with intervals, such as `0.1 + interval(0.2, 0.3)`, since `0.1` is `convert`ed to an `Interval` by Julia's promotion machinery.

### New functions
- The unexported function `IntervalArithmetic.atomic(Interval{T}, x)` creates the smallest atomic interval obtained by directed rounding, treating `x` as representing a real number (the old behaviour
of `convert`). [#114](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/114)

### Performance
- `sin` and `cos` are over 6 times faster. [#117](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/117)

- Various operations with `IntervalBox`es are faster, due to consistent use of
broadcasting. [#106](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/114)


### Documentation
- Documentation about interval arithmetic in general and construction of intervals
was improved.

### First contributions
- @tkoolen and @eeshan9815 made their first contributions to the package. Many thanks!


## v0.12

### API changes:

- The constructor `Interval(a, b)` has **had checks removed**, so **should not be used directly**; use `interval(a, b)` instead. This is for performance reasons. [#26](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/26)

- The changes to `a..b` and `a±b` were reverted; these operations are now slow again, but give the narrowest possible interval when interpreting `a` and `b` as the human version (rather than the machine version). E.g. `0.3` is treated as `3/10`, not the exactly-representable floating-point number closest to 0.3. [#97](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/97)

- Constructor `IntervalBox(II, Val{n})` added to easily make `IntervalBox`es that are `n` copies of a given interval [#79](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/79)


## v0.11

### Supported versions of Julia
- The package now supports only Julia v0.6 and later.
The only change in this version is to remove code supporting previous versions and
update syntax, e.g. `immutable` -> `struct`.

## v0.10

### Supported versions of Julia
- This is the last version that will support Julia v0.5.

### Performance

- Between 2x and 3x speedup for basic arithmetic operations, using [FastRounding.jl](https://github.com/JeffreySarnoff/FastRounding.jl) [#25](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/25)

- A fast version of the power function is available, with the name `pow`
[#42](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/42)


### API changes:

- The `Interval` rounding mode may be changed *only on Julia 0.6 and later* using e.g.
`setrounding(Interval, :accurate)`. The mode on Julia 0.5 is fixed to `:tight`
[#25](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/25)

- Renamed `infimum` -> `inf` and `supremum` -> `sup` [#48](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/48)

- The operators `..` and `±` for interval creation are now fast, but may give results that are slightly wider
[#37]([#30](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/30)

### v0.9.1

#### Docs

- Docs have been moved to use `Documenter.jl` [#31](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/31)

#### Bug fixes
- Bug fix for `mid` [#24](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/24)

- Bug fix for `tan` [#22](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/22)

#### API changes

- `mid` of `IntervalBox` now returns an `SVector` [#30](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/30)

#### Dependency changes
- The dependency on `ForwardDiff` has been removed [#13](https://github.com/JuliaIntervals/IntervalArithmetic.jl/pull/13)

## v0.9
- The former `ValidatedNumerics.jl` package has been split into `ValidatedNumerics.jl` and `IntervalRootFinding.jl`.

`ValidatedNumerics.jl` will now be a meta-package that re-exports both of these packages.

## v0.8

### Supported versions of Julia
- Julia v0.5 and higher are supported

### Breaking API changes
- **Only on Julia 0.6**, it is now possible to change the interval rounding type again, using `setrounding(Interval, :accurate)`; #220

- Changed `setdisplay` to `setformat`. Added `@format` macro to simplify interface, e.g.
`@format standard 5 true`; #251

- `mid` is now IEEE-1788 compliant, which changes the behaviour for semi-infinite intervals #253

### Other
- Changed from using `FixedSizeArrays.jl` to `StaticArrays.jl` for `IntervalBox`;
this should be invisible to the end user #245

- Fixed a bug in 1D interval Newton; #254


## v0.7

### End of support for Julia v0.4
- v0.7 is the last version to include support for Julia v0.4

### Breaking API changes
- Deprecate `displaymode`, replacing it with `setdisplay`, with simplified syntax #210:
```
setdisplay(:full)
```

### Added features
- Fast integer power function `pow` #208
- `parse(Interval, string)` (extends and exports previously internal function) #215
- `bisect` function in `ValidatedNumerics.RootFinding` for bisecting `Interval`s and `IntervalBox`es #217

### Other
- Many tests use `Test` instead of `FactCheck` #205
- Miscellaneous bugfixes

## v0.6
- Add a plot recipe for (only) 2D `IntervalBox`es using `RecipesBase.jl`.
This enables plotting using `Plots.jl`: an individual `IntervalBox` `X` using `plot(X)`,
and a `Vector` of them using `plot([X, Y])`

- Rewritten rounding functionality which gives type-stable interval functions, and hence
better performance

- `(1..2) × (3..4)` syntax for constructing `IntervalBox`es

- `@interval` now always returns an `Interval`.
Before e.g. `@interval mid(X)` for `X` an interval returned a number instead.



## v0.5
- Root finding has been moved into a separate submodule
[#154](https://github.com/dpsanders/ValidatedNumeris.jl/pull/154).

New usage:

using ValidatedNumerics
RootFinding.newton(...)

or
using ValidatedNumerics
using ValidatedNumerics.RootFinding
newton(...)

- Neighbouring root intervals are merged in the Newton and Krawczyk methods: [#156](https://github.com/dpsanders/ValidatedNumerics.jl/pull/156)


### v0.4.3
- Fix display of intervals with different setdisplay options; [#146](https://github.com/dpsanders/ValidatedNumerics.jl/pull/146)

- Add emptyinterval(x::IntervalBox); [#145](https://github.com/dpsanders/ValidatedNumerics.jl/pull/145)

### v0.4.2
- Add `setdiff` for n-dimensional `IntervalBox`es; [#144](https://github.com/dpsanders/ValidatedNumerics.jl/pull/144)

### v0.4.1
- Fix incompatibility for `IntervalBox` with latest tagged versions of `FixedSizeArrays.jl`
- Add `setdiff` for 2D `IntervalBox`es [#143](https://github.com/dpsanders/ValidatedNumerics.jl/pull/143)
- Make integer powers of complex intervals work [#142](https://github.com/dpsanders/ValidatedNumerics.jl/pull/142)

## v0.4
- Added decorated intervals [#112](https://github.com/dpsanders/ValidatedNumerics.jl/pull/112)

- Added `setdisplay` function for modifying how intervals are displayed [#115](https://github.com/dpsanders/ValidatedNumerics.jl/pull/115)

- Added `±` syntax for creating intervals as e.g. `1.3 ± 0.1` [#116](https://github.com/dpsanders/ValidatedNumerics.jl/pull/116)


## v0.3

- [Added `IntervalBox` type](https://github.com/dpsanders/ValidatedNumerics.jl/pull/88), representing a multi-dimensional (hyper-)box as a `FixedSizeArray` of `Interval`s.

- Internal clean-up, including rewriting what was the internal, unexported `make_interval`
function as (exported) methods for `convert`, so that you can now write e.g.
`convert(Interval{Float64}, "0.1")`; this is used by `@interval`.

- [Replaced](https://github.com/dpsanders/ValidatedNumerics.jl/pull/101) the simple automatic differentiation functionality that was part of
the package with the sophisticated `ForwardDiff` package.

- [Unified](https://github.com/dpsanders/ValidatedNumerics.jl/pull/102) the names of the
precision and rounding functions with the
new, [flexible names](https://github.com/JuliaLang/julia/pull/13232) in Julia v0.5:

- `set_interval_precision(x)` -> `setprecision(Interval, x)`.
- `get_interval_precision()` -> `precision(Interval)`
- `set_interval_rounding(x)` -> `setrounding(Interval, x)`
- `get_interval_rounding()` -> `rounding(Interval)`

- The ITF1788 test suite has been temporarily disabled on Julia v0.5 due to a
performance regression in parsing long test suites.

- `convert(Interval, x)` has been removed. You must specify the element type of
the interval, e.g. `convert(Interval{Float64}, 0.1)`

## v0.2

- Significant progress has been made towards conformance with the [IEEE 1788-2015 - IEEE Standard for Interval Arithmetic] (https://standards.ieee.org/findstds/standard/1788-2015.html), with many functions added, including hyperbolic functions (`cosh`, etc.)

- The [CRlibm.jl](https://github.com/dpsanders/CRlibm.jl) (Correctly-Rounded mathematics library) is now used to obtain correctly-rounded elementary functions (`sin`, `exp`, etc.) for `Float64` arguments. Functions that are not available in `CRlibm.jl` are taken from MPFR, and are hence slower; note that this includes the `^` function.

- Julia versions of files from the comprehensive [ITF1788 test suite](https://github.com/oheim/ITF1788) by Marco Nehmeier and Maximilian Kiesner have been included in our own test suite, thanks to the efforts of Oliver Heimlich. All relevant tests pass.

- Documentation has been enhanced.

- v0.2 **supports only Julia v0.4 and later**.

- Changes are detailed in [issue #31](https://github.com/dpsanders/ValidatedNumerics.jl/issues/31)


### 0.1.3

- Improvements towards conformance with the [IEEE-1788](https://standards.ieee.org/findstds/standard/1788-2015.html) standard for Interval Arithmetic:

- New `special_intervals.jl` file, with definitions of `emptyinterval`, `RR`, `nai` and related functions. Add new interval functions (`<=`, `radius`, `precedes`, `strictprecedes`, ``, etc).

- Control rounding tighter for arithmetic operations; `*`, `inv` and `/` have been rewritten; this includes changes in `make_interval` and `convert` to get consistent behavior. These functions pass the corresponding tests in the [ITF1788](https://github.com/oheim/ITF1788) test suite.
- Deprecate the use of `` in favor of `isinterior` (``).

**Important notice:** This is the **last version** of the package that
supports Julia v0.3.

### 0.1.2

- Increase test coverage and corresponding bug fixes
- Enable pre-compilation for Julia v0.4

### 0.1.1

- Re-enable tests for `Interval{Float64}` (`e0f3c1506f`)

## v0.1

v0.1 is the first public release of the package.

### Interval arithmetic
- Two methods for interval rounding are available:
(i) narrow/slow (which uses hardware rounding mode changes for `Float64` intervals, and (ii) wide/fast (which does not change the rounding mode)
- The current interval precision and rounding mode are stored in the `parameters` object
- The macro `@interval` generates intervals based on the current interval precision
- Trigonometric functions are "nearly" rigorous (for `Float64` intervals, correct rounding is not currently guaranteed)
- Inverse trigonometric functions are available
- Intervals of `BigFloat`s are displayed with the precision as a subscript numeral

### Root finding
- Newton and Krawczyk methods are implemented for rigorously finding simple roots of 1D real functions
- Stringent tests are performed, with various precision settings ( Float64` and `BigFloat )
tests:
- all non-"rev" tests from [ITF1788](https://github.com/oheim/ITF1788) are successful (except a broken test for the `dot` function, which should be irrelevant to interval arithmetic)
- the ITF1788 test suite is automatically generated during CI
18 changes: 9 additions & 9 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ version = "0.21.2"

[deps]
CRlibm = "96374032-68de-5a5b-8d9e-752f78720389"
EnumX = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
FastRounding = "fa42c844-2597-5d31-933b-ebd51ab2693f"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
RoundingEmulator = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705"
SetRounding = "3cc68bcd-71a2-5612-b932-767ffbe40ab0"

[weakdeps]
DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"

[extensions]
IntervalArithmeticDiffRulesExt = "DiffRules"

[compat]
CRlibm = "0.7, 0.8, 1"
EnumX = "1"
FastRounding = "0.2, 0.3"
CRlibm = "1"
DiffRules = "1"
RoundingEmulator = "0.2"
SetRounding = "0.2"
julia = "1.8"
julia = "1.9"
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ The official documentation is available online: https://juliaintervals.github.io

## Installation

The IntervalArithmetic.jl package requires to [install Julia](https://julialang.org/downloads/) (v1.8 or above).
The IntervalArithmetic.jl package requires to [install Julia](https://julialang.org/downloads/) (v1.9 or above).

Then, start Julia and execute the following command in the REPL:

Expand Down
Loading

0 comments on commit a699125

Please sign in to comment.