Note: With this refactoring, `math/utils' no longer depends on `rackunit'.
* (flexp2 x) computes (flexpt 2.0 x) but in about 1/3 the time for integer
`x' using a lookup table. Written for exact argument reduction in `fllog2'
after discovering that (flexpt 2.0 x) was the main performance bottleneck.
* (fllog2 x) computes (/ (fllog x) (fllog 2.0)) with near perfect accuracy.
Invented an algorithm to compute it with at least 8 extra bits before
final rounding; quite pleased with the result. Needed `fllog2' to ensure
(fllogb 2.0 x) would be exact when `x' is a power of two.
* (fllogb b x) computes (/ (fllog x) (fllog b)) with better accuracy, and
also handles limit values in a way that's consistent with the mathematical
limits. When those are ambiguous, it's consistent with `flexpt', which
follows IEEE 754 and C99. Otherwise returns +nan.0. See docs for details.
* `bflogb' is currently just for testing `fllogb'.
* Refactored FPU testing and documented it. So far, the only documented way
to do it is by calling `test-floating-point', which runs a comprehensive
deterministic+randomized suite of tests and returns a list representing
failed tests. I'll document individual tests after I document flonum
expansions and result/error functions like `fl+/error'.
* Added `fllog2' and `fllogb' to the flonum tests.
The fix consists of three parts:
1. Rewriting `inline-matrix*'. The material change here is that the
expansion now contains only direct applications of `+' and `*'.
TR's optimizer replaces them with `unsafe-fx+' and `unsafe-fx*',
which keeps intermediate flonum values from being boxed.
2. Making the types of all functions that operate on (Matrix Number)
values more precise. Now TR can prove that matrix operations preserve
inexactness. For example, matrix-conjugate : (Matrix Flonum) ->
(Matrix Flonum) and three other cases for Real, Float-Complex, and
Number.
3. Changing the return types of some functions that used to return
things like (Matrix (U A 0)). Now that we worry about preserving
inexactness, we can't have `matrix-upper-triangle' always return a
matrix that contains exact zeros. It now accepts an optional `zero'
argument of type A.
* Narrowed type of `submatrix' to only sensible argument types
* `matrix-invertible?' now returns #f when given a non-square matrix
instead of raising an error
* Allowed `matrix-diagonal' to operate on non-square matrices
* Fixed type of `matrix-expt'
* Made matrix functions respect `array-strictness' parameter (mostly
wrapping functions with `parameterize' and return values with
`array-default-strictness'; reindentation makes changes look larger)
* Added strictness tests
* Added parameter `array-strictness', default #t
* Added `array-default-strict!' and `array-default-strict', which act
like the functions without "default" in the name when
`array-strictness' is #t; otherwise they do nothing
* Lots of small changes to existing array functions, mostly to ensure
computations are done using nonstrict arrays, but return values are
strict when `array-strictness' is #t
* Added strictness tests
* Added tests to ensure untyped code can use `math/array'
* Rewrote `array-map' exported to untyped code using untyped Racket
* Rearranged a lot of `math/array' documentation
* At least stubbed out all (or almost all) `math/matrix' exports; many
have complete documentation (e.g. types, predicates, accessors,
constructors, for loops, conversion, much of "Comparing Matrices")
* Moved `matrix-zero?' and fixed to use (matrix-error-norm) as its norm
* Added `matrix-basis-cos-angle' (currently a stub; should return smallest
singular value of a certain matrix multiplication)
* Gram-Schmidt using vector type
* QR decomposition
* Operator 1-norm and maximum norm; stub for 2-norm and angle between
subspaces (`matrix-basis-angle')
* `matrix-absolute-error' and `matrix-relative-error'; also predicates
based on them, such as `matrix-identity?'
* Lots of shuffling code about
* Types that can have contracts, and an exhaustive test to make sure
every value exported by `math/matrix' has a contract when used in
untyped code
* Some more tests (still needs some)
* Consolidated Gauss and Gauss-Jordan elimination
* Fixed Gaussian elimination to return all indexes for pivotless columns,
not just those < m
* Consolidated `matrix-row-echelon' and `matrix-reduced-row-echelon'
* Specialized row reduction for determinants; removed option to not do
partial pivoting (it's never necessary otherwise)
* Added `matrix-invertible?'
* Removed `matrix-solve-many'; now `matrix-solve' solves for multiple
columns
* Gave `matrix-inverse' and `matrix-solve' optional failure thunk arguments
* Made some functions that return multiple columns return arrays instead
(i.e. `matrix-column-space')
* Added more tests
* Split "matrix-constructors.rkt" into three parts:
* "matrix-constructors.rkt"
* "matrix-conversion.rkt"
* "matrix-syntax.rkt"
* Made `matrix-map' automatically inline (it's dirt simple)
* Renamed a few things, changed some type signatures
* Fixed error in `matrix-dot' caught by testing (it was broadcasting)
* Rewrote matrix comprehensions in terms of array comprehensions
* Removed `in-column' and `in-row' (can use `in-array', `matrix-col' and
`matrix-row')
* Tons of new rackunit tests: only "matrix-2d.rkt" and
"matrix-operations.rkt" are left (though the latter is large)
* Finally added `array-axis-expand' as a dual for `array-axis-reduce'
in order to implement `vandermonde-matrix' elegantly
* Better, shorter matrix multiply; reworked all matrix arithmetic
* Split "matrix-operations.rkt" into at least 5 parts:
* "matrix-operations.rkt"
* "matrix-basic.rkt"
* "matrix-comprehension.rkt"
* "matrix-sequences.rkt"
* "matrix-column.rkt"
Added "matrix-constructors.rkt"
Added `matrix', `row-matrix', and `col-matrix' macros
A lot of other little changes
Currently, `in-row' and `in-column' are broken. I intend to implement
them in a way that makes them work in untyped and Typed Racket.
* `list->array' now accepts an optional shape argument, and always returns
an immutable array
* `vector->array' now accepts an optional shape argument, and always
returns a mutable array
* Removed `make-mutable-array' because `vector->array' does its job now (I
never liked the name anyway)
* Renamed `unsafe-mutable-array' to `unsafe-vector->array'
* Added optional type annotation to `array' macro to match `mutable-array'
* Reworded error messages in array broadcasting functions
* Made minor array doc fixes
renamed `partition-count' to `partitions' to be consistent with
`permutations', and gave better examples in `multinomial' docs
* (flulp-error +inf.0 +nan.0) was returning +nan.0 instead of +inf.0
* Type of `multinomial' didn't match its docs or `flmultinomial'
* Reworded docs for `diagonal-array'
* Reworked/reordered quite a few things in docs for `math/bigfloat'
* Fixed first identity given in `gamma-inc' docs
* Fixed descrption for `+max.0', etc.
* Fixed and added tests for `quantile' and `median', documented them
* Added `sort-samples', documented it
* Removed `real-quantile' and `real-median' (too many design choices
right now; will revisit when implementing Kernel Density Estimators)
* Documented `absdev' and `absdev/median'
* Fixed `update-statistics*': now uses O(1) space as advertised (if the
sequences of values and weights both use O(1) space)
* Changed types of binning functions: allows using #:key in the future
(when TR supports function type cases that differ only by keyword
argument types better), places optional weights at the end like other
statistics functions
* Clarified binning docs about sort stability and half-open intervals
When libmpfr wasn't available, the function created by `make-not-available'
would try to print any _mpfr arguments, which would call the custom _mpfr
printer, which would try to use a libmpfr function, which would call the
function created by `make-not-available', which would try to print...
Cleaned up expected value code a little
Refactored running statistics objects (hid private fields, added
`update-statistics*')
Documented expected value functions and running statistics
Removed `bfpsi0' from bigfloat tests (DrDr's libmpfr doesn't have it)
Commented out custodian shutdown callback that frees MPFR's cache
(something's broken)
of libmpfr (like DrDr's) that don't have it
Reimplemented really simple FFI functions (e.g. mpfr-prec, mpfr-exp) to
avoid calling overhead
Renamed `bigfloat-sign' to `bigfloat-signbit'
Renamed `bigfloat-sig+exp' to `bigfloat->sig+exp' (for symmetry with
`sig+exp->bigfloat')
use longs for the "limbs" of bigints. However, when GMP's configure script
detects that mingw64 is compiling, it defines LONG_LONG_LIMB, which makes the
type of limbs long long, or 64 bits. This is fine; a 64-bit machine should use
64-bit ints for the digits of its bigints. It would have been nice to know
this special case earlier, though I can see why it's not advertised: most
users don't need to know, and it seems like it's obviously the right choice to
make when dealing with Win64's annoying ABI.
Made "mpfr.rkt" search for 'mpfr_set_z_exp if 'mpfr_set_z_2exp isn't found.
Hopefully this allows the bigfloat tests to finish on DrDr. If not, DrDr
will need a libmpfr upgrade.
Made some minor doc fixups