-
Notifications
You must be signed in to change notification settings - Fork 33
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Rewrite the Intervals module entirely (#1108)
* feat: Rewrite the Intervals module entirely The existing Intervals module suffers from multiple drawbacks. It is undocumented, uses a questionable implementation where explanations associated with each internal bounds have unclear semantics (did I mention it is not documented), and it has been the source of many soundness bug in the past due to the way it uses exceptions to indicate emptiness. This makes it hard to extend the module; for instance #1058 was delayed because we were not quite sure whether the implementation of functions related to bit-vectors were correct. This patch is a reimplementation of the Intervals module from scratch. The new implementation keeps the representation used by the `intersect` futnction in the existing implementation (and in a way can be thought of as resolving the TODO in the existing implementation suggesting to generalize that type). It is thoroughly documented, and is split between a "core" module that provides safe functions to deal with explanations, and specialized implementations for common functions (addition, multiplication, etc.) using the "core" interface such that reasoning about the implementation of addition etc. does not require thinking about explanations at all. This makes it easier to extend the module with new specialized functions. The implementation is done through a (small) family of functors, allowing separate implementations for real and integer intervals that prevent accidentally mixing them up. For the time being, the old interface is re-implemented on top of the new interface (except where implementation details leaked too much) so as to keep the changes mostly confined to the `Intervals` module. Migrating to the new interface (and especially abandoning the use of exceptions) will be done in a second step. The patch is relatively big, but can't realistically be split into smaller parts without ending up in intermediate states full of dead code. I suggest reviewers first take a look at the documentation of the `OrderedType`, `Interval` and `Union` signatures in the `Intervals_intf` module (note that this includes some LaTeX, and might be easier to read using `odoc` -- I tried to make sure the `odoc`-generated documentation was usable). This should provide a good understanding of the "core" functionality of the new implementation. The rest of the review can be split into parts that should be mostly independent: - Implementation of the `OrderedType` interface for `Z.t` and `Q.t` in `ZEuclideanType` and `QAlgebraicType`; - Implementation of the concrete functions for addition, multiplication, etc. in the `Intervals` module; - Re-implementation of the old API in the `Intervals.Legacy` module (and minor related changes in other modules, notably `IntervalCalculus`); - Implementation of the "core" functionality in the `Intervals_core` module.
- Loading branch information
1 parent
84e29b9
commit 1f2ddc2
Showing
12 changed files
with
2,906 additions
and
1,456 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.